設計模式- 抽象工廠(Abstract Factory)

意圖

抽象工廠(Abstract Factory)模式意圖:爲創建一組相關或相互依賴對象提供了一個接口,而且無需指定它們的具體類

抽象工廠可以向客戶提供一個接口,是客戶可以在不必指定產品具體類型的情況下,創建多個產品家族中的產品對象,它強調的系列對象的變化。

C#例子

    public abstract class Product
    {
        public abstract string GetName(ProductType productType);
    }
    public abstract class ProductType
    {
        public abstract string GetProductType();
    }

    public class ProductA : Product
    {
        public override string GetName(ProductType productType)
        {
            return "我是A產品,型號是"+productType.GetProductType();
        }
    }
    public class ProductB : Product
    {
        public override string GetName(ProductType productType)
        {
            return "我是B產品,型號是"+productType.GetProductType();
        }
    }
    public class ProductType1 : ProductType
    {
        public override string GetProductType()
        {
            return "1";
        }
    }
    public class ProductType2 : ProductType
    {
        public override string GetProductType()
        {
            return "2";
        }
    }

public abstract class Factory
    {
        public abstract Product CreateProduct();

        public abstract ProductType CreateProductType();
    }

    public class FactoryA1 : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductA();
        }

        public override ProductType CreateProductType()
        {
            return new ProductType1();
        }
    }
    public class FactoryB2 : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductB();
        }

        public override ProductType CreateProductType()
        {
            return new ProductType2();
        }
    }
    public class Client
    {
        private Product _product;
        private ProductType _productType;

        public Client(Factory factory)
        {
            _product = factory.CreateProduct();
            _productType = factory.CreateProductType();
        }

        public void Run()
        {
            Console.WriteLine(_product.GetName(_productType));
        }
    }
        static void Main(string[] args)
        {
            var client1 = new Client(new FactoryA1());
            client1.Run();
            var client2 = new Client(new FactoryB2());
            client2.Run();
            Console.ReadLine();
        }

抽象工廠模式參與者:

  • Factory:聲明一個創建抽象產品對象的操作接口
  • Factory*:實現創建具體產品對象的操作
  • Product:聲明一類產品產品對象接口
  • Product*: 定義一個被相應具體工廠創建的產品對象 ,實現Product接口
  • ProductType:聲明與Product有關聯的對象接口
  • ProductType*:定義一個被相應具體工廠創建的產品對象 ,實現ProductType接口
  • Client:使用Factory和Product類聲明的接口

抽象工廠模式適用情形

  • 同一個產品族的Product在一起使用時,而且它們之間是相互依賴的,不可分離
  • 系統需要由相互關聯的多個對象來構成
  • 當想提供一組對象而不顯示它們的實現過程,只顯示它們的接口
  • 系統不應當依賴一些具體Product類

抽象工廠模式的特點

  • 隔離了具體類的生成,客戶不需要知道怎樣生成每一個具體Product,什麼時間生成的。它將客戶與具體的類分離,依賴於抽象類,耦合性低。
  • 一個產品族中的多個對象設計成一起工作,它能保證客戶端始終只使用一個產品族中的對象。這對一些需要根據當前環境來決定其行爲的軟件系統來說是非常實用的一種設計模式。
  • 有利於更換產品系列,由於客戶端只依賴於抽象類,更換產品系列時,只需要更改一下具體工廠名就可以。
  • 難以支持新種類的產品,這是因爲抽象工廠接口確定了可以被創建的產品集合,支持新種類的產品就需要擴展該工廠接口,這將引起抽象工廠類及其所有子類的改變。

其他

抽象工廠模式與工廠方法模式區別(產品個數)

  • 工廠方法模式只有一個抽象產品類,而抽象工廠模式可以有多個抽象產品類
  • 工廠方法模式針對一個產品等級結構,可以派生出多個具體產品類;抽象工廠模式針對面向多個產品等級結構,每個抽象產品類可以派生出多個具體產品類。

源碼地址

dotnet-design-patterns

其他設計模式

23種設計模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章