博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GenericFactoryMethod泛型工厂模式实现简单IOC功能
阅读量:5173 次
发布时间:2019-06-13

本文共 4498 字,大约阅读时间需要 14 分钟。

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();        }    }    ///     /// 抽象道路    ///     public abstract class Road    {        ///         /// 该抽象方法,没有实际意义,只为演示效果        ///         /// 
public abstract string ShowMessage(); } /// /// 现代化道路 /// public class ModernRoad : Road { public override string ShowMessage() { return "I am Modern Road"; } } /// /// 抽象房屋 /// public abstract class House { /// /// 该抽象方法,没有实际意义,只为演示效果 /// ///
public abstract string ShowMessage(); } /// /// 现代化房屋 /// public class ModernHouse : House { public override string ShowMessage() { return "I am Modern House"; } } /// /// 前面的随笔中说过,抽象工厂是为了解决系列抽象对象的创建,所以里面会有>1个抽象对象的创建方法 /// public abstract class AbstractFactory { public abstract Road CreateRoad(); public abstract House CreateHouse(); } /// /// 现代化房屋和道路的创建工厂 /// public class ModernFactory : AbstractFactory { public override House CreateHouse() { return new ModernHouse(); } public override Road CreateRoad() { return new ModernRoad(); } } /// /// 构建系统 /// 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
where T : class { public static T Get() { return _create.Create(); } static ICreator _create; interface ICreator { T Create(); } class Creator
: ICreator where TChild:T,new() { public T Create() { return new TChild(); } } class SingletonCreator
: ICreator where TChild : T, new() { ///
/// 初始化TChild的时候会调用static构造函数,所以线程安全. /// static readonly T Instance = new TChild(); public T Create() { //这里单例可以使用双检锁创建单例对象,也可以使用"内联初始化"来创建单例对象 return Instance; } } ///
/// 支持继承关系的Set方法 /// ///
public static void Set
() where TChild:T,new() { _create = new Creator
(); } ///
/// 支持单例同时支持继承的Set方法 /// ///
public static void SetSingleton
() where TChild : T, new() { _create = new SingletonCreator
(); } } ///
/// 构建系统 /// public class BuildSystem { public void Build() { //注册ModernRoad对象,Transiant模式 Factory
.Set
(); var r1=Factory
.Get().GetHashCode(); var r2= Factory
.Get().GetHashCode(); Console.WriteLine("r1和r2引用" + (ReferenceEquals(r1, r2) ? "相等" : "不相等")); //注册ModernRoad对象,单例模式 Factory
.SetSingleton
(); var s1 = Factory
.Get(); var s2 = Factory
.Get(); Console.WriteLine("s1和s2引用"+(ReferenceEquals(s1, s2)?"相等":"不相等")); } }

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

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

 

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

你可能感兴趣的文章
语法测试
查看>>
CES1
查看>>
java webcontroller访问时报415错误
查看>>
qcow2、raw、vmdk等镜像格式
查看>>
Jzoj5455【NOIP2017提高A组冲刺11.6】拆网线
查看>>
特定字符序列的判断(1028)
查看>>
华为面试
查看>>
平衡二叉树(AVL Tree)
查看>>
【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
查看>>
【CF799E】Aquarium decoration 线段树
查看>>
大运飞天 鲲鹏展翅
查看>>
从ECMA到W3C
查看>>
软件工程--第十六周学习进度
查看>>
yii2 ActiveRecord多表关联以及多表关联搜索的实现
查看>>
搜狗输入法安装--ubuntu
查看>>
ps/2接口键盘的输入及显示
查看>>
Swift———a Glance(极客学院)笔记
查看>>
【poj3294-不小于k个字符串中最长公共子串】后缀数组
查看>>
java如何获取其它用户登录的真是IP地址
查看>>
Jquery通过指定层次关系获取元素
查看>>