GenericFactoryMethod泛型工厂模式实现简单IOC功能
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功能的更多相关文章
- Java学习笔记——Java工厂模式之简单工厂
package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
- Objective-C 工厂模式(上) -- 简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- 使用工厂模式解耦和IoC思想
使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...
- 【LabVIEW技巧】工厂模式_简单工厂
前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...
- javascript设计模式-工厂模式(简单工厂)
接口在工厂模式中起着很重要的作用,如果不对对象进行某种类型检查的以确保其实现了必要的方法,工厂模式的好处也就所剩无几了,举个简单的例子. Interface.js // Constructor. va ...
- 工厂模式vs简单工厂
前言 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断 ...
随机推荐
- mysql读写分离——中间件ProxySQL的简介与配置
mysql实现读写分离的方式 mysql 实现读写分离的方式有以下几种: 程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助. am ...
- Postfix邮件服务器
http://www.postfix.org/INSTALL.html https://www.cnblogs.com/alex-note/p/6840160.html http://linux.vb ...
- python 基础———— 字符串常用的调用 (图2)
1. replace 2. join 3.split 4 rsplit 5. strip : 去除字符串左右两边特定(指定)的字符 7. rstrip : 去除右边特定(指定)的字符 8. l ...
- lua杂记
protoc-gen-lua 编译.安装.使用教程: https://blog.csdn.net/huutu/article/details/49672225 https://github.com/s ...
- Webpack-dev-server的proxy用法
前言: devServer:{ contentBase:'./', proxy:{ // 当你请求是以/api开头的时候,则我帮你代理访问到http://localhost:3000 // 例如: / ...
- istio实现自动sidecar自动注入(k8s1.13.3+istio1.1.1)
一.自动注入的前提条件 自动注入功能需要kubernetes 1.9或更高版本: kubernetes环境需支持MutatingAdmissionWebhook: 二.在namespace中设置自动注 ...
- 信号量(Semaphore)
在python的多线程体系中,一共有4种锁: 同步锁(互斥锁):Lock: 递归锁:RLock: 信号量:Semaphore: 同步条件锁:Condition. 信号量(semaphore)是一种可以 ...
- bootstrap-datepicker简单使用
粗略整理,可能存在其他的方式请大家多多指教 选择年份 html <div class="dropdown"> <label class="search- ...
- Spring aop框架使用的jar包
除了前两个jar包,后面的jar包spring框架包中都有,前两个jar包的下载地址:https://pan.baidu.com/s/1L-GLGT1c8vnwFwqLxzzZuw
- 画线代码V1.0.0
画线代码: 最终效果图: 优点: 1.效果还行,计算量也不大(就一点2维直线一般式能有多少运算量). 缺点: 1.每条线怎么也是建模,可能会有点开销. 2.编辑起来很是麻烦. 代码部分: /***** ...