GenericFactoryMethod泛型工厂模式实现简单IOC功能
生活随笔
收集整理的這篇文章主要介紹了
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容器的功能.所以在設計一些模塊的時候也可以考慮將泛型工廠作為創建型模式的一種選擇方案.
當然你也可以進一步的擴展,通過一個字典類,來完成配置文件的方式,來動態的完成對象的注入,這里就不演示,自行實現.
?
轉載于:https://www.cnblogs.com/GreenLeaves/p/10597890.html
總結
以上是生活随笔為你收集整理的GenericFactoryMethod泛型工厂模式实现简单IOC功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象第一次总结
- 下一篇: Android TV 快进帧预览