1、简介

泛型工厂理论上不算Gof23中设计模式之一,但是也算是一种非常好的设计模式,个人认为,废话不多说,先写个简单的抽象工厂,在写一个泛型工厂的例子来比较抽象和泛型的区别.

2、实战

还是房屋和道路,always road and house,例子不重要重要的是对模式的理解.

3、抽象工厂

    public class Program
{
public static void Main(string[] args)
{
var build = new BuildSystem(new ModernFactory());
build.Build();
Console.ReadKey();
}
} /// <summary>
/// 抽象道路
/// </summary>
public abstract class Road
{
/// <summary>
/// 该抽象方法,没有实际意义,只为演示效果
/// </summary>
/// <returns></returns>
public abstract string ShowMessage();
} /// <summary>
/// 现代化道路
/// </summary>
public class ModernRoad : Road
{
public override string ShowMessage()
{
return "I am Modern Road";
}
} /// <summary>
/// 抽象房屋
/// </summary>
public abstract class House
{
/// <summary>
/// 该抽象方法,没有实际意义,只为演示效果
/// </summary>
/// <returns></returns>
public abstract string ShowMessage();
} /// <summary>
/// 现代化房屋
/// </summary>
public class ModernHouse : House
{
public override string ShowMessage()
{
return "I am Modern House";
}
} /// <summary>
/// 前面的随笔中说过,抽象工厂是为了解决系列抽象对象的创建,所以里面会有>1个抽象对象的创建方法
/// </summary>
public abstract class AbstractFactory
{
public abstract Road CreateRoad(); public abstract House CreateHouse();
} /// <summary>
/// 现代化房屋和道路的创建工厂
/// </summary>
public class ModernFactory : AbstractFactory
{
public override House CreateHouse()
{
return new ModernHouse();
} public override Road CreateRoad()
{
return new ModernRoad();
}
} /// <summary>
/// 构建系统
/// </summary>
public class BuildSystem
{
private AbstractFactory _abstractFactory;
public BuildSystem(AbstractFactory abstractFactory)
{
_abstractFactory = abstractFactory;
} public void Build()
{
var house=_abstractFactory.CreateHouse();
var road=_abstractFactory.CreateRoad();
Console.WriteLine($"{house.ShowMessage()},现已被创建");
Console.WriteLine($"{road.ShowMessage()},现已被创建");
}
}

ok,简单的通过抽象工厂解决了现代化风格房屋的创建,且BuildSystem并没有依赖具体的现代化房屋和道路的实现,他依赖的是抽象,且如果这个时候需要其他风格的房屋和道路的创建,只需要通过扩展的方式依次添加抽线和具体的实现来完成需求.这里就不实现了,自行参考前面的随笔.

2、泛型工厂

下面来通过泛型工厂来实现上面的案例

    public class Program
{
public static void Main(string[] args)
{
new BuildSystem().Build();
Console.ReadKey();
}
} public abstract class Road
{
public abstract string ShowMessage();
} public class ModernRoad : Road
{
public override string ShowMessage()
{
return "I am Modern Road";
}
} public class Factory<T> where T : class
{
public static T Get()
{
return _create.Create();
} static ICreator _create;
interface ICreator
{
T Create();
} class Creator<TChild> : ICreator where TChild:T,new()
{
public T Create()
{
return new TChild();
}
} class SingletonCreator<TChild> : ICreator where TChild : T, new()
{
/// <summary>
/// 初始化TChild的时候会调用static构造函数,所以线程安全.
/// </summary>
static readonly T Instance = new TChild();
public T Create()
{
//这里单例可以使用双检锁创建单例对象,也可以使用"内联初始化"来创建单例对象
return Instance;
}
} /// <summary>
/// 支持继承关系的Set方法
/// </summary>
/// <typeparam name="TChild"></typeparam>
public static void Set<TChild>() where TChild:T,new()
{
_create = new Creator<TChild>();
} /// <summary>
/// 支持单例同时支持继承的Set方法
/// </summary>
/// <typeparam name="TChild"></typeparam>
public static void SetSingleton<TChild>() where TChild : T, new()
{
_create = new SingletonCreator<TChild>();
}
} /// <summary>
/// 构建系统
/// </summary>
public class BuildSystem
{ public void Build()
{
//注册ModernRoad对象,Transiant模式
Factory<Road>.Set<ModernRoad>();
var r1=Factory<Road>.Get().GetHashCode();
var r2= Factory<Road>.Get().GetHashCode();
Console.WriteLine("r1和r2引用" + (ReferenceEquals(r1, r2) ? "相等" : "不相等")); //注册ModernRoad对象,单例模式
Factory<Road>.SetSingleton<ModernRoad>();
var s1 = Factory<Road>.Get();
var s2 = Factory<Road>.Get();
Console.WriteLine("s1和s2引用"+(ReferenceEquals(s1, s2)?"相等":"不相等"));
} }

上面使用泛型工厂配合C#其他一些特性完成了一个简单版的IOC容器的功能.所以在设计一些模块的时候也可以考虑将泛型工厂作为创建型模式的一种选择方案.

当然你也可以进一步的扩展,通过一个字典类,来完成配置文件的方式,来动态的完成对象的注入,这里就不演示,自行实现.

GenericFactoryMethod泛型工厂模式实现简单IOC功能的更多相关文章

  1. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

  2. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  4. Objective-C 工厂模式(上) -- 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  5. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  6. 使用工厂模式解耦和IoC思想

    使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...

  7. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...

  8. javascript设计模式-工厂模式(简单工厂)

    接口在工厂模式中起着很重要的作用,如果不对对象进行某种类型检查的以确保其实现了必要的方法,工厂模式的好处也就所剩无几了,举个简单的例子. Interface.js // Constructor. va ...

  9. 工厂模式vs简单工厂

    前言 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断 ...

随机推荐

  1. maven 在clean package时,出现:找不到符号 [ERROR] 符号: 方法 sqlDdlFilter(java.lang.String) 解决办法

    另一个项目中增加了,sqlDdlFilter 在调用的项目中clean package时,出现 找不到符号[ERROR] 符号: 方法 sqlDdlFilter(java.lang.String) 原 ...

  2. eval函数的特点和作用

    eval(): 作用:它的作用是把对应的字符串解析成js代码并运行(将json的字符串解析成为JSON对象): 特点:它是一个全局函数: 缺点:1>在该函数内部申明的变量都是全局变量,且申明的变 ...

  3. canvas绘制圆图输出图片格式

    function drawCircleImage(url, callback) { const canvas = document.createElement('canvas'); const img ...

  4. gensim和jieba分词进行主题分析,文本相似度

    参考链接:https://blog.csdn.net/whzhcahzxh/article/details/17528261 demo1:结巴分词: # 构造分词库,格式如下: ''' [['楼下', ...

  5. 实践中 XunSearch(讯搜)的使用教程步骤

    XunSearch(讯搜)的使用教程步骤 一.安装编译工具 yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql ...

  6. C++ STL next_permutation(快速排列组合)

    排列组合必备!! https://blog.csdn.net/bengshakalakaka/article/details/78515480

  7. python_redis简介与安装和使用

    一.简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  8. js获取当前页面的url网址信息小汇总

    在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结. 下面我们举例一个URL,然后获得它的各个组成部分:http://i.cnblog ...

  9. Unicode vs. UTF-8 etc.

    目测是个老问题了.随便一搜,网上各种总结过.这里不辞啰嗦,尽量简洁的备忘一下. 几个链接,有道云笔记链接,都是知乎上几个问题的摘录:阮一峰的日志,1-5 还是值得参考,但是之后的部分则混淆了 Wind ...

  10. 学习Python第四天

    关于剩下的数据类型:字符串 字符串是有序的,不可变的(不可变的意思是指将变量a重新赋值后不会覆盖原来的值,而是在内存中开辟了一块新的内存地址,存储变量的值) 字符串的各种方法: 1,将字符串中的大写变 ...