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容器的功能.所以在设计一些模块的时候也可以考虑将泛型工厂作为创建型模式的一种选择方案.

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

转载于:https://www.cnblogs.com/GreenLeaves/p/10597890.html

GenericFactoryMethod泛型工厂模式实现简单IOC功能相关推荐

  1. 你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

    很多人认为工厂模式很简单,只是有一个建造工厂,帮我们进行对象构造而已.那么请尝试回答下以下问题: 1.工厂模式分为几类? 2.GOF 23种设计模式中,工厂方法模式和抽象工厂模式有什么区别? 3.不在 ...

  2. GOLANG工厂模式、简单工厂模式、抽象工厂模式、创建者模式

    设计模式可以大大提高代码复用性,使得程序的修改更加灵活.另外将各个功能模块抽象解耦出来,在某个模块需要更改时不至于会对整体代码进行修改,解耦的好的话只简单修改几个地方即可以切换某个模块在实现上的切换, ...

  3. 设计模式-工厂模式(简单工厂,工厂模式,抽象工厂)

    1.工厂模式的初心,本质 工厂模式:本质是创建类的实例,将类的实例的创建和使用隔离. 模型特点:创建时根据参输的不同返回不同的实例.而这些个不同的类型的实例,都是同一个基类的实例. 简单工厂的特点: ...

  4. Java工厂模式(简单工厂、工厂方法、抽象工厂)详解

    工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式.在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象. 1.工厂模式的理解 1.1.工厂模式的分类 工厂模 ...

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

    声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...

  6. JAVA设计模式——工厂模式【简单工厂模式、工厂方法模式、抽象工厂模式】

    目录 简单工厂模式 传统方式 简单工厂模式 静态工厂模式 工厂方法模式 抽象工厂模式 工厂模式JDK-Calendar源码分析 工厂模式小结 简单工厂模式   看一个具体的需求 看一个披萨的项目:要便 ...

  7. java简单工厂模式_Java 简单工厂模式

    Java 简单工厂模式 2014-05-28·WeaponX 3717 次浏览 ## 介绍 简单工厂模式又称静态工厂模式. 简单工厂模式由工厂类角色.抽象产品角色和具体产品角色组成. 工厂类角色是本模 ...

  8. 设计模式—工厂模式之简单工厂模式

    1. 简单工厂模式简介 简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂 ...

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

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

最新文章

  1. RxJava 实现模糊搜索
  2. printf()详解之终极无惑-转载
  3. C++ 对象动态建⽴和释放 new 和 delete
  4. android 视频监控相关(打包下载)
  5. 细数网络上十七种安全威胁
  6. ReactJS入门之ReactJS简介
  7. [2021-09-11 CQBZ/HSZX多校联考 T1] 茅山道术 (后缀和优化dp)
  8. 数据结构--堆 Heap
  9. 分块 数据不相同_ArcGIS四分法分幅栅格数据(超强版)
  10. 【转】.Net 架构图
  11. Redis 6.0 源码阅读笔记(0) -- Redis 哈希表和字典 铺垫
  12. java ico_Java 读写 ICO 图像
  13. 计算机英语课外知识竞赛,英语知识竞赛活动方案
  14. python携程怎么做数据同步_利用python yielding创建协程将异步编程同步化
  15. Office - - Excel宏录制批量处理格式相同文件
  16. 用python让excel 飞起来(数据处理与分析操作)
  17. DXperience的汉化步骤,相当简单
  18. GeneMark-ES:真核生物编码基因预测软件
  19. php根据某一标识获取所有上级id或所有下级id
  20. 小白学流程引擎-FLowable(五) — BPMN2.0模型规范

热门文章

  1. 关于错误 openssl/ssl.h:没有那个文件或目录的解决办法
  2. Core Animation放大缩小;CAKeyframeAnimation
  3. 《一起》个人进展——Day06
  4. JavaScript 学习笔记 之事件
  5. SAP FI模块与SD、MM的接口配置基本方法
  6. 设计模式复习-抽象工厂模式
  7. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )
  8. 【C 语言】文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )
  9. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )
  10. 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )