(1.2)工廠模式之工廠方法模式

 工廠方法模式角色分配:

  1. 抽象工廠(Abstract Factory)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。
  2. 具體工廠(Concrete Factory)角色 :這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建某一種產品對象。
  3. 抽象產品(AbstractProduct)角色 :工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。
  4. 具體產品(Concrete Product)角色 :這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應

 

interface IFactory //工廠接口
    {
        IProduct GetProduct();
    }

    //A工廠類
    public class FactoryA: IFactory
    {
        IProduct productA;
        public FactoryA()
        {
            this.productA = new ProductA();
        }

        public IProduct GetProduct() //A工廠生產A產品
        {
            return this.productA;
        }
    }

    //B工廠類
    public class FactoryB : IFactory
    {
        IProduct productB;
        public FactoryB()
        {
            this.productB = new ProductB();
        }

        public IProduct GetProduct() //B工廠生產B產品
        {
            return this.productB;
        }
    }

    //產品接口
    public interface IProduct
    {
        //產品方法
        //......
    }

    //產品A
    public class ProductA : IProduct
    {
        //產品屬性
        //......
    }

    //產品B
    public class ProductB : IProduct
    {
        //產品屬性
        //......
    }

//調用
Ifactory factoryA =new factoryA();
Iproduct pa=factory.GetProduct();
Iproduct pb=factory.GetProduct();

工廠方法模式優缺點

在工廠方法模式中,核心工廠類不在負責產品的創建,而是將具體的創建工作交給子類去完成。也就是後所這個核心工廠僅僅只是提供創建的接口,具體實現方法交給繼承它的子類去完成。當我們的系統需要增加其他新功能時,只需要創建對應工廠和產品即可,這樣很好地符合了「開放-封閉「原則。

雖然工廠方法模式滿足了"開放-封閉」原則,但是這個模式也仍然有缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,是的系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。

開放封閉原則(Open Closed Principle)描述

符合開放封閉原則的模塊都有兩個主要特性:

1. 它們 "面向擴展開放(Open For Extension)"。

也就是說模塊的行爲是能夠被擴展的。當應用程序的需求變化時,我們可以使模塊表現出全新的或與以往不同的行爲,以滿足新的需求。

2. 它們 "面向修改封閉(Closed For Modification)"。

模塊的源代碼是不能被侵犯的,任何人都不允許修改已有源代碼。

 

仔細觀察這段代碼,在工廠模式中,已經將工廠類分開,不再將所有產品在同一工廠中生產,這樣就解決了簡單工廠中不停的switch case的問題。如果說來了一個C產品,那麼我們只需要寫一個C工廠和C產品,在調用時用C工廠生產C產品即可,A和B工廠和產品完全不受影響。OK,優化說完了,但是還是有問題。

問題在哪裏呢?當業務需求是需要生產產品族的時候,工廠就不再適合了。首先我們搞清楚何謂產品族和產品等級結構。舉個例子來說,比如三星是一個品牌,三星生產洗衣機,電視,冰箱;格力也是一個品牌,格力也生產洗衣機,電視,冰箱。那麼,三星工廠和格力工廠生產的2個品牌的洗衣機,就在洗衣機這種產品的產品等級結構中(當然洗衣機產品等級結構中還有LG,海爾,三菱等等不同的品牌的工廠的產品),所以,洗衣機就是一個產品等級。那麼三星生產的三星洗衣機,三星電視機,三星冰箱就是三星這個工廠的產品族。可能還會有西門子工廠產品族,格力工廠產品族,美的工廠產品族等等。

(也就是說我們的前提是工廠只有一種,但它可以生成多種產品,若要不同的工廠,則這種設計模式不符合)