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. Asp.net Zero 应用实战-官方示例PhoneBook学习1_修改1版

    适用Zero版本:ASP.NET Core & Angular 2+ (aspnet-zero-core-3.1.0). 该版本官方有两个solution文件夹:Angular(前端) 和 a ...

  2. Cookie随笔

    解决了服务器不能识别不同浏览器的问题,相当于给每个浏览器加了个“身份证”. Cookie首先由服务器创建发给浏览器,随后浏览器每次访问服务器时都带上这个Cookie. Cookie缺点: ·Cooki ...

  3. SQL: Cannot create JDBC driver of class '' for connect URL

    使用数据库数据源的web 项目,发布后,访问数据库500报错: 浏览器端: 控制台: 数据库连接池在不启动Tomcat的情况下,测试类通过,没有问题. 一旦在服务器发布,就会出现问题,考虑是Tomca ...

  4. Springboot & Mybatis 构建restful 服务四

    Springboot & Mybatis 构建restful 服务四 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务三 2 restful ...

  5. (python)编程小练习

    1.将一串字符串反向输出,如将"abcd"变成“dcba” str1="abcd" print str1[::-1] 2.判断是否为回文——判断用户输入的字符串 ...

  6. Python 打印矩形、直角三角形、等腰三角形、菱形

    # 1)打印一个星号 print('*') #2)打印一行6个星号 * * * * * * for i in range(6): print('*',end=' ') #3)打印6列星号 * * * ...

  7. MFC中添加控制台输出

    可以在CWinApp的InitInstance()中调用下面的函数,以生成控制台: #include <io.h> #include <fcntl.h> void InitCo ...

  8. abaqus的umat在vs中debug调试

    配置参考:https://www.jishulink.com/content/post/333909 常见错误:http://blog.sina.com.cn/s/blog_6116bc050100e ...

  9. Spring流行的十大理由

    Spring大概是每个JAVA程序员都听过的框架,但是它为什么能这么流行? 听到咕泡学院的Tom老师的公开课,下面是他总结的阿里为什么选择Spring的十大理由,我觉得这也是Spring能流行的原因: ...

  10. SpringCloud消息总线

    我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...