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),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断 ...
随机推荐
- tomcat简介与配置
tomcat简介 tomcat就是常用的的中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中.而tomcat本身的运行也依赖于j ...
- LOL新版符文 怎么查看队友的符文配置?
LOL怎么看其他玩家符文? 像我这种名字都懒的打的, 直接去WeGame复制昵称. 然后在LOL主界面点生涯, 之后搜索 光头强xian生
- C语言闰年问题程序框图
判定2000-2500年中的每一年是否为闰年,并将结果输出. 先分析闰年成立条件: 1)能被4整除,但不能被100整除的年份都是闰年: (2)能被400整除的年份是闰年: #include<st ...
- 2019.03.25 bzoj2329: [HNOI2011]括号修复(fhq_treap)
传送门 题意简述: 给一个括号序列,要求支持: 区间覆盖 区间取负 区间翻转 查询把一个区间改成合法括号序列最少改几位 思路: 先考虑静态的时候如何维护答案. 显然把所有合法的都删掉之后序列长这样: ...
- MySQL数据库(二)-数据库的增删改查
简介: 以下是MySQL最基本的增删改查语句.在进行“增删改查”的操作之前,先建立一个包含数据表student的数据库,新建表grade(具体操作可以见上一篇). 一."增"-添加数据 1.1 为表中 ...
- SFTP文件服务器的搭建
由于公司项目的需要,需要自己搭建一个SFTP文件服务器,来实现不同IP服务器之间文件的传输: 应用的场景:由于需要缓解服务器的压力,需要对服务进分离,分别放置在不同IP服务器上: 首先提供一个SFTP ...
- eclipse新建的项目,也添加到tomcat上了,地址栏访问的时候就是访问不到。。。怎么办
其实是可以访问的,目前我遇到以下两种可能出现这种现象的原因: 1.这个项目在你写的过程中改了名字,这样你访问改后的名字是不行的,需要在下图,也就是server服务器的server.xml文件中修改访问 ...
- Freeradius服务器的搭建流程
Freeradius服务器的搭建流程 一.服务器方面的配置 1 .安装radius服务器,数据库扩展插件 预先安装mysql数据库,然后安装freeradius,以及freeradius的数据库扩展插 ...
- JAVA RSA非对称加密详解[转载]
一.概述1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现2.java6支持RSA算法3.RSA算法可以用于数据加密和数字签名4.RSA算法相对于DES/AES等对称加密算 ...
- 关于CSS层叠机制
谈到层叠机制,首先我们要知道什么是声明冲突. 声明冲突有三个条件:①多个选择器选中同一个元素:②声明块里的属性相同:③属性的属性值不同.同时满足这三点时就会产生声明冲突.比如下图html代码: < ...