1. 程式人生 > >小白設計模式入門(4)—— 抽象工廠模式

小白設計模式入門(4)—— 抽象工廠模式

一、引言

從簡單工廠模式->工廠模式->抽象工廠模式,都是為了克服之前的一些缺點而設計的。工廠方法模式具有很好的可擴充套件性,但是一個工廠只建立單個產品這樣的例子很少,常常需要建立多個系列的產品。抽象工廠能很好地解決一系列產品建立的問題。

二、實現示例

抽象工廠示例

    #region 自己寫的抽象工廠
    /// <summary>
    /// 抽象工廠,將所有裝置抽象出來
    /// </summary>
    public interface IEquipAbstractFactory
    {
        ICamera CreateCamera
(); IRadar CreateRadar(); } /// <summary> /// 攝像頭介面 /// </summary> public interface ICamera : IEquip { new string GetName(); } /// <summary> /// 衛星定位裝置介面 /// </summary> public interface IRadar : IEquip { new string GetName
(); } /// <summary> /// 第一個航行器 /// </summary> public class FirstVehicleFactory: IEquipAbstractFactory { public ICamera CreateCamera() { return new HikVision(); } public IRadar CreateRadar() { return new LaserRadar
(); } } public class HikVision: ICamera { public string GetName() { return nameof(HikVision); } } public class LaserRadar : IRadar { public string GetName() { return nameof(LaserRadar); } } #endregion

新增工廠


    /// <summary>
    /// 現在增加第二個航行器
    /// </summary>
    public class SecondVehicleFactory : IEquipAbstractFactory
    {
        public ICamera CreateCamera()
        {
            return new Uniview();
        }

        public IRadar CreateRadar()
        {
            return new MillimeterWaveRadar();
        }
    }

    public class Uniview : ICamera
    {
        public string GetName()
        {
            return nameof(Uniview);
        }
    }

    public class MillimeterWaveRadar : IRadar
    {
        public string GetName()
        {
            return nameof(MillimeterWaveRadar);
        }
    }

呼叫示例


    public class AbstractFactoryClient
    {
        public static void Test()
        {
            IEquipAbstractFactory e1 = new FirstVehicleFactory();
            var c1 = e1.CreateCamera();
            var r1 = e1.CreateRadar();
            
            string tmp = "";
            tmp = c1.GetName();
            Console.WriteLine(tmp);
            tmp = r1.GetName();
            Console.WriteLine(tmp);

            IEquipAbstractFactory e2 = new SecondVehicleFactory();
            var c2 = e2.CreateCamera();
            var r2 = e2.CreateRadar();

            tmp = c2.GetName();
            Console.WriteLine(tmp);
            tmp = r2.GetName();
            Console.WriteLine(tmp);
        }
    }

三、分析

優點: 抽象工廠模式將具體產品的建立延遲到具體工廠的子類中,這樣將物件的建立封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴充套件

缺點: 抽象工廠模式很難支援新種類產品的變化。這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。

場景(前提):

  • 1、一個系統不要求依賴產品類例項如何被建立、組合和表達的表達,這點也是所有工廠模式應用的前提。
  • 2、這個系統有多個系列產品,而系統中只消費其中某一系列產品
  • 3、系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。