源碼:
源代碼C#
系列導航:
目錄
定義(Factory Pattern):
用來創建目標對象的類,將相似對象的創建工作統一到一個類來完成。
一、簡單工廠模式:
代碼:
/// <summary>/// 產品枚舉/// </summary>public enum ProductEnum{ConcreateProductA,ConcreateProductB}/// <summary>/// 簡單工廠模式:/// 簡單工廠模式的工廠類一般是使用靜態方法,通過接收的參數的不同來返回不同的對象實例。/// 不修改代碼的話,是無法擴展的。(如果增加新的產品,需要增加工廠的Swith分支)/// 不符合【開放封閉原則】/// </summary>public static class SimpleFactory{public static AbstractCar Create(ProductEnum productType){switch (productType){case ProductEnum.ConcreateProductA:return new ConcreateCarA();case ProductEnum.ConcreateProductB:return new ConcreateCarB();default:return null;}}}
/// <summary>/// 測試簡單工廠模式/// </summary>private static void TestSimpleFactory(){Console.WriteLine("簡單工廠模式:");var productA = SimpleFactory.Create(ProductEnum.ConcreateProductA);productA.GetInfo();Console.ReadLine();}
優缺點:
工廠類包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類。對于客戶端來說,去除了對具體產品的依賴。
不符合【OCP】。
應用場景:
當工廠類負責創建的對象比較少時可以考慮使用簡單工廠模式。
二、反射工廠模式(基于簡單工廠模式的拓展)
通過反射,以完成工廠對對象的創建。可以最大限度的解耦。
代碼:
/// <summary>/// 反射工廠模式/// 是針對簡單工廠模式的一種改進/// </summary>public static class ReflectFactory{public static AbstractCar Create(string typeName){Type type = Type.GetType(typeName, true, true);var instance = type?.Assembly.CreateInstance(typeName) as AbstractCar;return instance;}}
/// <summary>/// 測試反射工廠模式/// </summary>private static void TestReflectFactory(){Console.WriteLine("反射工廠模式:");var productB = ReflectFactory.Create("FactoryPattern.ConcreateCarB");productB.GetInfo();Console.ReadLine();}
PS:反射工廠模式可以和配置文件配合使用,效果更佳
三、工廠方法模式
定義:
定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法將類的實例化延長到子類。
類圖:
啟示:
工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創建不同的產品實例。在同一等級結構中,支持增加任意產品。
代碼:
/// <summary>/// 工廠方法模式:/// 工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創建不同的產品實例。/// 在同一等級結構中,支持增加任意產品。/// 符合【開放封閉原則】,但隨著產品類的增加,對應的工廠也會隨之增多/// </summary>public interface IFactoryMethod{AbstractCar Create();}public class ConcreateFactoryA:IFactoryMethod{public AbstractCar Create(){return new ConcreateCarA();}}public class ConcreateFactoryB : IFactoryMethod{public AbstractCar Create(){return new ConcreateCarB();}}
/// <summary>/// 測試工廠方法模式/// </summary>private static void TestFactoryMethod(){Console.WriteLine("工廠方法模式:");IFactoryMethod factoryB =new ConcreateFactoryB();var productB = factoryB.Create();productB.GetInfo();Console.ReadLine();}
優缺點:
符合【OCP】,但隨著產品類的增加,對應的工廠類也會隨之增多。
工廠方法模式實現時,客戶端需要決定實例化哪個工廠來創建對象。工廠方法把簡單工廠的內部創建對象的邏輯判斷移到了客戶端。如果需要修改,只需要修改客戶端即可!
應用場景:
單一產品的創建。
三、抽象工廠模式
定義:
為創建一組相關或相互依賴的對象提供一個接口,而且無需指定它們的具體類。
類圖:
啟示:
抽象工廠是應對產品族概念的,比如說,每個汽車公司可能要同時生產轎車,貨車,客車,那么每一個工廠都要有創建轎車,貨車和客車的方法。
代碼:
/// <summary>/// 抽象工廠模式:/// 抽象工廠是應對產品族概念的,比如說,每個汽車公司可能要同時生產轎車,貨車,客車,那么每一個工廠都要有創建轎車,貨車和客車的方法。/// 應對產品族概念而生,增加新的產品線很容易,但是無法增加新的產品。/// </summary>public interface IAbstractFactory{AbstractCar CreateCar();AbstractBus CreateBus();}/// <summary>/// 寶馬工廠/// </summary>public class BMWFactory:IAbstractFactory{public AbstractCar CreateCar(){return new ConcreateCarA();}public AbstractBus CreateBus(){return new ConcreateBusA();}}/// <summary>/// 比亞迪工廠/// </summary>public class BYDFactory : IAbstractFactory{public AbstractCar CreateCar(){return new ConcreateCarB();}public AbstractBus CreateBus(){return new ConcreateBusB();}}
/// <summary>/// 測試抽象工廠模式/// </summary>private static void TestAbstractFactory(){Console.WriteLine("抽象工廠模式:");var bmwFactory = new BMWFactory();bmwFactory.CreateCar().GetInfo();bmwFactory.CreateBus().GetInfo();var bydFactory = new BYDFactory();bydFactory.CreateCar().GetInfo();bydFactory.CreateBus().GetInfo();Console.ReadLine();}
優缺點:
應對產品族概念而生,增加新的產品線很容易,但是無法增加新的產品。
應用場景:
一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
這個系統有多個系列產品,而系統中只消費其中某一系列產品
系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。
總結:
簡單工廠:簡單實用,但違反開放封閉;
工廠方法:開放封閉,單一產品;
抽象工廠:開放封閉,多個產品;
反射工廠:可以最大限度的解耦。