簡單工廠 VS 工廠方法 VS 抽象工廠

weixin_34162629發表於2015-12-18

         說到設計模式。自然少不了簡單工廠模式。工廠方法和抽象工廠這三姐妹。

它們之間可謂是各有所長,術業專攻啊!這篇部落格來簡單的梳理一下三者之間的關係。

那麼工廠又是什麼意思呢?結合三者的特點,我覺得能夠這樣理解:工廠能夠看做一個特殊的類,在這個類中專門負責生產一系列產品(物件)的一個集合就能夠成為工廠。

那麼上述三種模式之間到底是如何的關係呢?各自又有什麼優缺點呢?

一、簡單工廠模式 VS 工廠方法模式

1、先來看一個簡單工廠的一段程式碼:

public class OperationFactory
    {
        //宣告一個方法用來例項化,但是為什麼要用靜態方法呢                                            public  static Operation createOperate(string operate)                              {
            Operation oper = null;
            switch (operate )
            {
                  //通過分支語句對子類進行例項化                                                          case "+":
                    oper = new OperationAdd();
                     break;
                case "-":
                    oper = new OperationSub();
                    break;
                case "*":
                    oper=new OperationMul ();
                    break;
                case "/":
                    oper =new OperationDiv ();
                    break;

            }
            return oper ;
        }

通過程式碼我們能夠看出。在簡單工廠中,能夠講多種須要例項化的物件在一個分支結構中一次性的完畢。詳細的選擇要留給client去做。

比如:

oper= OperationFactory.createOperate("+");

那我們繼續擴充套件。當我們想要在程式中新增一種演算法符號,這時,我們必須對簡單工廠中的分支語句進行改動。這樣事實上就違背了設計模式中的開放——封閉原則。為了避免對內改動。我們再來看一下工廠方法模式。

2、工廠方法模式

       核心思想:建立一個介面,子類去實現這個介面。同一時候,依據子類來決定到底要例項化哪個物件。

看一段程式碼:

    interface IFactory //定義一個介面
    {//非靜態                                                                                                                           Operation CreateOperation();

    }
    class AddFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();//子類j決定詳細對哪個子類進行例項化
        }
    }

    class SubFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }

其餘程式碼類似略。

     通過工廠方法模式。我們能夠發現,假設如今再新增一個運算子的話。我們僅僅須要額外新增一個運算子子類和實現介面的子類就好了,而不用去對已經寫好的類進行改動了。可見與簡單工廠相比,工廠方法模式遵循了開放——封閉原則:即對外擴充套件,對內封閉。

另一個小小的差別:在簡單工廠中用static宣告方法為靜態方法,而工廠方法中卻未用到靜態方法,原因是:在簡單工廠中因為不須要子類進行繼承,所以使用靜態方法能夠避免例項化。能夠用類來直接呼叫方法。而在工廠方法中因為存在繼承關係,所以不能使用靜態方法

二、 工廠方法 VS 抽象工廠

      我覺得事實上這二者本屬於一類。

      最基本的差別是:

      工廠方法:涉及到的是僅僅需定義一個產品類和一個物件介面。能夠派生出多個子類。

      而抽象工廠:定義一系列即多個產品類和多個物件介面。分別派生出多個子類。

     這裡,不多做解釋。

三、簡單工廠 VS 抽象工廠 

      在抽象工廠中能夠定義多個產品類和物件介面,但是,假設我們想要在此基礎上多加一個產品,那麼此時。須要新增的類就會非常多。同一時候還須要去更改涉及到的各個工廠。這事實上無形中就已經新增了程式碼的維護量。

對於程式設計來說又是一個不好的兆頭。那麼有什麼辦法能夠改進它呢?事實上,簡單工廠能夠彌補這個缺陷。

舉一個大話設計模式中的樣例:建立資料庫:SqlServer和Access兩類,同一時候包括IUser和IDepartment兩張表假設用抽象工廠方法來設計如圖:

如圖,假設此時,我們想要在新增一個專案表Project時。必須新增專案介面。SqlserverProject和AccessProject的類同一時候。還必須改動企業兩個工廠,在兩個工廠中新增例項化Project的項,造成程式碼維護量新增。

此時。假設我們把IFactory抽象工廠用一個DataAccess來取代。同一時候新增一個字串變數,利用簡單工廠來例項化字串變數中所指定的資料庫。

簡單工廠方法的類圖例如以下:

當然,我們能夠看出來。利用簡單工廠方法。儘管修改相對少了。可是仍然違背了開放——封閉原則。由於在新增其它表時。仍須要修改DataAccess中的分支語句,所以。對於簡單工廠和抽象工廠方法二者應該酌情使用。二者都有自己的長處和缺點,我們應該依據詳細情況詳細分析。

當然為了進一步改進。大話設計模式中還提到了利用“反射”和配置檔案的技術。總之。設計模式是一門藝術,僅僅有更好。沒有最好!

 

 

 

    

相關文章