一個例子穿插三種不同的工廠模式形態

fan_rockrock發表於2016-04-07

1、簡單工廠模式

工廠類根據提供給它的引數,返回的是幾個產品中的一個類的例項。通常情況下,它返回的是一個公共的父類,在這個工廠類裡面,父類的引用指向子類的物件

廠長生產杯子時先不讓生產線知道我要產的是玻璃的還是瓷的,而是讓它在不知道具體材料的情況下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形狀的具體杯子了。所以就有了簡單工廠模式。

<span style="font-size:14px;">  class CupFactory
    {
        public static CUP CreateCup(string 種類)
        {
            杯子 cup = null;
            switch (種類)
            {
                case “玻璃杯":
                    {
                        cup = new GlassCup();
                        break;
                    }
                case “陶瓷杯":
                    {
                        cup = new ChinaCup();
                        break;
                    }
            }
            return cup;
        }
    }
</span>

<span style="font-size:14px;"> static void Main(string[] args)
        {
            杯子 cup;
            cup = CupFactory.CreateCup(種類);
        }
</span>


2、工廠方法模式

          定義一個用於建立產品物件的工廠的介面,而將實際建立工作放在工廠介面的子類中。


  簡單工廠模式有一個問題,就是當我現在想生產一個同樣形狀的鐵杯時,工廠裡並沒有定義相應的處理流程,只能更改CreateCup方法,這就不合理了(違背封閉原則)。
       我現在只是想生產鐵杯,你只要在最後的時候把玻璃原料換成鐵的不就行了嗎,幹嘛還要更改整條生產線呢?於是就有了工廠模式。

   static void Main(string[] args)
        {
             IFactory CupFactory = new 鐵杯子factory();
             Cup cup = CupFactory.CreateCUP();
        }


3、抽象工廠模式

  用來建立產品族


假如現在工廠主想要生產水壺(kettle),用工廠模式就不得不再造一條水壺生產線,能不能在水杯生產線同時生產水壺呢?這就是抽象工廠模式。在原CupFactory中加一個CreateKettle()方法,用來生產水壺。



總結:

簡單工廠模式:用來生產同一等級中的任意產品(不支援增加新產品)。產品具體構造細節是在一個個if/else分支,或者在switch/case分支裡面的。如果要增加一個產品,則需要修改工廠類,增加if/else分支,或者增加一個case分支。


工廠方法模式:用來生產同一等級結構中的固定產品(支援增加新產品)。將工廠和產品之間的耦合降低,將具體產品的構造過程放在了具體工廠類裡面。在以後擴充套件產品的時候方便很多,只需要新增一個工廠類,一個產品類,就能方便的新增產品,而不需要修改原有的程式碼。該模式更符合開發中的OCP原則(open close principle),對擴充套件開放,對修改關閉。
        一個抽象產品類,可以派生出多個具體產品類。
        一個抽象工廠類,可以派生出多個具體工廠類。


抽象工廠模式:用來生產不同產品族的全部產品(不支援產品增加,但支援產品族的增加)
        多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
        一個抽象工廠類,可以派生出多個具體工廠類。
        每個具體工廠類可以建立多個具體產品類的例項。

相關文章