設計模式:抽象工廠方法模式


之前寫的模式帖子:

 設計模式系列目錄

今天說一下抽象工廠模式:提供一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。

抽象工廠允許客戶使用抽象的接口來創建一組相關的產品,而不需要知道實際產出的具體產品是什么,這樣一來,客戶就從具體的產品中被解耦

我之前說過設計模式:工廠方法模式,我們最后會做一下兩種模式的區別

我們看用類圖看一下這個模式

每個抽象產品都有多於一個的一個人的具體子類,工廠角色怎么知道實例化哪一個子類?比如我們這個圖,每個抽象產品都有兩個具體產品,

抽象工廠有兩個具體的工廠,分別對應這兩個具體產品角色,每一個具體工廠只負責某一個家族的產品的實例化

我們來看一下代碼

#region 抽象工廠模式

    #region 產品
    #region 產品A
    /// <summary>
    /// 抽象產品A
    /// </summary>
    public abstract class ProductA
    {

    }

    public class ConcreteProductA1 : ProductA
    {
        public ConcreteProductA1()
        {
            Console.WriteLine("ProductA的ConcreteProductA1...A1");
        }
    }
    public class ConcreteProductA2 : ProductA
    {
        public ConcreteProductA2()
        {
            Console.WriteLine("ProductA的ConcreteProductA2...A2");
        }
    }
    #endregion

    #region 產品B
    /// <summary>
    /// 抽象產品B
    /// </summary>
    public abstract class ProductB
    {

    }

    public class ConcreteProductB1 : ProductB
    {
        public ConcreteProductB1()
        {
            Console.WriteLine("ProductB的ConcreteProductB1類...B1");
        }
    }
    public class ConcreteProductB2 : ProductB
    {
        public ConcreteProductB2()
        {
            Console.WriteLine("ProductB的ConcreteProductB2類...B2");
        }
    }

    #endregion

    #endregion


    #region 工廠類
    public abstract class Creator
    {
        public abstract ProductA CreateProductA();
        public abstract ProductB CreateProductB();
    }

    public class ConcreteCreatorA : Creator
    {
        public override ProductA CreateProductA()
        {
            return new ConcreteProductA1();
        }

        public override ProductB CreateProductB()
        {
            return new ConcreteProductB1();
        }
    }

    public class ConcreteCreatorB : Creator
    {
        public override ProductA CreateProductA()
        {
            return new ConcreteProductA2();
        }

        public override ProductB CreateProductB()
        {
            return new ConcreteProductB2();
        }
    }

    #endregion
    #endregion  
//Client
        static void Main(string[] args)
        {            

            #region 抽象工廠模式
            Creator _creatorA = new ConcreteCreatorA();
            _creatorA.CreateProductA();
            _creatorA.CreateProductB();

            Creator _creatorB = new ConcreteCreatorB();
            _creatorB.CreateProductA();
            _creatorB.CreateProductB();
            #endregion

            Console.ReadLine();
        }  

 

抽象工廠模式除了具有工廠方法模式的做點外,主要就是可以在類的內部對產品族進行約束。所謂的產品族一般都有一定的聯系,抽象工廠模式就可以

在類內部對產品族的關聯關系進行描述,而不必專門引入一個新的類來進行管理。抽象模式最大的缺點就是產品族的擴展,如果要加一個新的產品,差不多所有

的工廠類都需要進行修改,所以使用抽象工廠模式時,對產品等級結構的划分是非常重要的。

這們來說一個抽象工廠模式和工廠模式的區別:

我們看一下抽象模式的類圖:設計模式:工廠方法模式

工廠方法模式:
一個抽象產品類,可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類可以創建多個具體產品類的實例。
區別:
工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM