抽象工廠模式(Abstract Factory Pattern)

定義(Definition)

抽象工廠模式爲一個產品家族提供了統一的創建接口。當需要這個產品家族的某一系列的時候,可以從抽象工廠中選出相對的系列來創建一個具體的工廠類別。

動機(Motivation)

在軟件系統中,經常面臨着“一系列相互依賴的對象”的創建工作;同時,由於需求的變化,

往往存在更多系列對象的創建工作。

結構(Structure)

角色(Roles)

抽象工廠(Abstract Factory):聲明一個創建抽象產品對象的接口操作。

具體工廠(Concret Factory):實現創建具體產品對象的操作。

抽象產品(Abstract Product):爲一類產品對象聲明一個接口。

具體產品(Concrete Product):定義一個將被相應的具體工廠創建的產品對象,實現AbstractProduct接口。

Client僅適用由AbstractFatory和AbstractProduct類聲明的接口。

適用情況

1.一個系統要獨立於它的產品的創建、組合和表示時。

2.一個系統要多個產品系列中的一個來配置時。

3.需要強調一系列相關的產品對象的設計以便進行聯合使用時。

4.提供一個產品類庫,而只想顯示它們的接口而不是實現時。

舉例

還是以華爲和OPPO進行舉例,他們可以看做兩個系列,華爲系列,OPPO系列,華爲系列又包括華爲手機產品,華爲平板產品,OPPO系列也同樣包括OPPO手機產品,OPPO平板產品。

圖中ConcreteFactory1爲華爲工廠,ConcreteFactory2爲OPPO工廠

AbstractProductA爲抽象產品手機,AbstractProductB爲抽象產品平板電腦

ProductA1是華爲手機,ProductA2是OPPO手機

ProductB2是OPPO平板,ProductB1是華爲平板

IPhone接口,用來客戶端訪問,解除與具體手機類訪問的耦合,對應於結構圖當中的Abstract ProductA

    interface IPhone
    {
        void Start();  //啓動
        void Off();    //關機
    }

HuaWeiPhone具體產品類,對應結構圖中的ProductA1

    class HuaweiPhone:IPhone
    {
        public void Start()
        {
            Console.WriteLine("華爲手機開機了");
        }

        public void Off()
        {
            Console.WriteLine("華爲手機關機了");
        }
    }

OPPOPhone具體產品類,對應結構圖中的ProductA2

    class OPPOPhone :IPhone
    {
        public void Start()
        {
            Console.WriteLine("OPPO手機開機了");
        }

        public void Off()
        {
            Console.WriteLine("OPPO手機關機了");
        }
    }

ITabletComputer接口,用來客戶端訪問,解除與具體平板類訪問的耦合,對應結構圖中的AbstractProductB

    interface ITabletComputer
    {
        void Start();
    }

華爲具體平板產品類,實現平板接口,對應結構圖中的ProductB1

    class HuaweiTablet : ITabletComputer
    {
        public void Start()
        {
            Console.WriteLine("華爲平板電腦啓動了");
        }
    }

OPPO具體平板產品類,實現平板接口,對應結構圖中的ProductB2

    class OPPOTablet : ITabletComputer
    {
        public void Start()
        {
            Console.WriteLine("OPPO平板電腦啓動了");
        }
    }

定義一個抽象工廠接口,對應結構圖中的Abstract Factory

    interface IFactory
    {
        IPhone CreatePhone();
        ITabletComputer CreateTablet();
    }

定義HuaweiFactory具體的工廠類,實現IFactory接口,對應結構圖中的ConcreteFactory1

    class HuaweiFactory : IFactory
    {
        public IPhone CreatePhone()
        {
            return new HuaweiPhone();
        }

        public ITabletComputer CreateTablet()
        {
            return new HuaweiTablet();
        }
    }

定義OPPOFactory具體的工廠類,實現IFactory接口,對應結構圖中的ConcreteFactory2

    class OPPOFactory : IFactory
    {
        public IPhone CreatePhone()
        {
            return new OPPOPhone();
        }
        public ITabletComputer CreateTablet()
        {
            return new OPPOTablet();
        }
    }

客戶端代碼

            IFactory factory = new HuaweiFactory();
            IPhone phone = factory.CreatePhone();
            phone.Start();
            phone.Off();
            ITabletComputer tablet = factory.CreateTablet();
            tablet.Start();
            Console.Read();

運行結果

如果想要創建OPPO系列的手機和平板,只需要改變客戶端的代碼的下面這行就可以了:

IFactory factory = new HuaweiFactory();  →   IFactory factory = new OPPOFactory();

運行結果如下

總結:它適用於系列產品,但是它的缺點是難以支持新種類的產品,因爲抽象工廠接口確定了可以被創建的產品集合,所以難以擴展抽象工廠以生產新種類的產品。也就是說,如果現在華爲和OPPO又增加了一個新的業務,生產筆記本電腦,那麼我們需要在抽象工廠接口中增加,而且華爲和OPPO兩個具體工廠也要改變,這就違反了開閉原則。

如有問題,歡迎大家指正~~~

 

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