《設計模式》 - 2. 工廠模式( Factory )

Cleve_baby發表於2018-07-06

Javascript設計模式 - 原文連結

簡單工廠模式 (Simple Factory) :

語言 : JavaScript

說明 :

以一個生產汽車的工廠為例 , 來闡述3個工廠設計模式.

產品類 :

現在有兩種車型, 他們都繼承父類(Car), 兩種車具有父類的所有屬性和方法.

//cc.Class 是 cocos2d - JS 中的 Class .
var Car = cc.Class.extend({
    //ctor 是建構函式 .
    ctor: function(){

    },
})

var A_Car = Car.extend({
    ctor: function(){
        alert("A型車");
    },
})

var B_Car = Car.extend({
    ctor: function(){
        alert("B型車");
    },
})
  • 工廠類 :

工廠提供方法生產並且返回產品.

var Factory = {
    createCar: function(type){
        switch (type)
        {
            case "A":
                return new A_Car();
                break;
            case "B":
                return new B_Car();
                break;
        }
    }
}
  • 客戶類 :

客戶類呼叫工廠類裡的建立汽車的方法, 傳入型別即可獲得對應型號的產品.

var car = Factory.createCar("B");  //B型車
  • 1

簡單工廠模式的3個主要部分 :

1. 抽象產品 : 例子中的基類(父類)“Car”, 所有具體產品都繼承它 , 具有它的屬性和方法. 
2. 具體產品 : 例子中的“A_Car”“B_Car”, 簡單工廠模式中建立例項的物件. 
3. 工廠類 : 例子中的“Factory”, 做一些邏輯判斷和處理 , 是簡單工廠模式中的 核心.

小結 :

簡單工廠模式 , 從名字上看就知道這個設計模式很簡單 , 它的功能是封裝程式裡不希望被客戶知道的例項化細節 , 將實現過程隱藏起來 ,明確各自的職責和權利 , 有利於整個軟體體系結構的優化.


工廠方法模式 (Factory Method) :

產品類 :

和簡單工廠模式產品類一樣 , 兩種車型, 繼承Car基類, 具有基類的所有屬性和方法.

var Car = cc.Class.extend({
    ctor: function(){

    },
})

var A_Car = Car.extend({
    ctor: function(){
        alert("A型車");
    },
})

var B_Car = Car.extend({
    ctor: function(){
        alert("B型車");
    },
})

工廠類 :

與簡單工廠模式有所不同 , 工廠模式的 Factory 是一個抽象類 , 裡面提供一個抽象方法 , 供給其他具體工廠類繼承、實現 , 這樣處理的原因是當建立的產品型別需要增加時 , 可以很好的遵循 open & close 設計原則 , 對擴充開放 對修改關閉 .

var Factory = cc.Class.extend({
    createCar : function(){

    }
})

var A_CarFactory = Factory.extend({
    createCar : function(){
        return new A_Car();
    }
})

var B_CarFactory = Factory.extend({
    createCar : function(){
        return new B_Car();
    }
})

客戶類 :

var factory = new A_CarFactory();
var Acar = factory.createCar();   //A型車

工廠方法的4個主要部分 :

1. 抽象產品 : 基類(父類)“Car”, 所有具體產品都繼承它 , 具有它的屬性和方法.(和簡單工廠模式一樣) 
2. 具體產品 : “A_Car”“B_Car”, 建立例項的物件.(和簡單工廠模式一樣) 
3. 抽象工廠類 : 基類(父類)“Factory”, 它提供抽象方法給具體工廠類 繼承 和 實現 , 是工廠方法的 核心
4. 具體工廠類 : “A_CarFactory ” 和 ” B_CarFactory “, 繼承並實現介面父類的 介面.

小結 :

1. 工廠模式和簡單工廠模式最大的區別是 , 工廠模式多了抽象工廠類 , 這樣的好處是 , 當有新產品新增的時候(需求變化) , 可以直接擴充套件一個新的工廠 , 而不是修改原來的工廠類程式碼 , 這樣做是為了遵循 open & close 設計原則 .

2. 在工廠模式中 , 一個具體的工廠類 , 只允許生產一個相對應產品 , 簡單的說就是 , 當你選擇了一個具體工廠類的時候 , 就選擇了具體產品 , 相對於簡單工廠,將選擇產品的動作提前了.


抽象工廠模式 (Abstract Factory) :

假設需求改變 , 例如不同型號的車需要不同型號的電池 , 在生產時 , 給他們配備符合車型號的電池 , 當這樣需求出現的時候 , 可以考慮使用抽象工廠模式建立 .

產品類 :

//抽象產品類  車(Car)
var Car = cc.Class.extend({
    ctor: function(){

    }
});

//具體產品類
var A_Car = Car.extend({
    ctor: function(){
        alert("A型車");
    }
});

var B_Car = Car.extend({
    ctor: function(){
        alert("B型車");
    }
});

//----------------------------

//抽象產品類  電池(Battery)
var Battery = cc.Class.extend({
    ctor: function(){

    }
});

//具體產品類
var A_Battery = Battery.extend({
    ctor: function(){
        alert("A型電池");
    }
});

var B_Battery = Battery.extend({
    ctor: function(){
        alert("B型電池");
    }
});

工廠類 :

// 抽象工廠類  Factory 
var Factory = cc.Class.extend({
    createCar : function(){

    },

    createBattery : function(){

    }
});

// 具體工廠類 
var A_CarFactory = Factory.extend({

    createCar : function(){
        return new A_Car();
    },

    createBattery : function(){
        return new A_Battery();
    }
});

var B_CarFactory = Factory.extend({

    createCar : function(){
        return new B_Car();
    },

    createBattery : function(){
        return new B_Battery();
    }
});

客戶類 :

var factory = new A_CarFactory();
var Acar = factory.createCar();          // A型車
var ABattery = factory.createBattery();  // A型電池

工廠方法的4個主要部分 :

1. 抽象產品 : 基類(父類)“Car” 和“Battery” , 對應具體產品繼承它 , 具有它的屬性和方法. 
2. 具體產品 : “A_Car”“B_Car”“A_Battery”“B_Battery”, 繼承抽象類 , 建立例項的物件. 
3. 抽象工廠類 : 基類(父類)“Factory”, 它提供抽象方法給具體工廠類 繼承 和 實現 , 是抽象工廠模式的 核心
4. 具體工廠類 : “A_CarFactory ” 和 ” B_CarFactory “, 繼承並實現介面父類的 介面.

小結 :

1. 想比較起工廠方法 , 抽象工廠模式最大的亮點在於可以建立多個產品 , 並且保留了工廠模式的所有優點. 
2. 對客戶建立過程再進行封裝一下或者說套用簡單工廠模式的具體工廠類 , 可以做到讓客戶類在不必指定產品具體型別的情況下,建立多個產品族中的產品物件 .


總結 :

共同點 :

1. 建立過程類似 , 作用類似 . 
2. 都具有抽象產品類具體產品類工廠類 , 其中 具體產品類 繼承 抽象產品類 . 
3. 工廠類例項化產品類(new生成產品類的例項化物件) , 並將生成的產品類的物件提供給外部使用 .

不同點 :

簡單工廠模式 :

1. 一般只包含一個具體的工廠類 , 沒有抽象工廠類 . 
2. 工廠類直接被客戶類呼叫, 可以生成所有產品類的物件 
3. 工廠類內部一般是類似於switch的結構 , 根據傳入的標誌自己判斷、處理, 最後返回產品 .


工廠方法 :

1. 一般具有抽象產品類具體產品類抽象工廠類 和 具體工廠類 , 其中 具體工廠類 都要繼承 抽象工廠類 , 具體工廠類可以存在多個 . 
2. 與簡單工廠模式相比 , 具體工廠類 不做邏輯處理 , 只提供方法生成產品 , 一個具體工廠對應一個具體產品 .


抽象工廠模式 :

1. 
抽象工廠模式中 具有多個 抽象產品類 . 
工廠方法中 只有一個抽象產品類 .

2. 
抽象工廠模式中的 具體工廠類 可以生產多個產品 . 
工廠方法中 只能生產一個 .

附加 :

  • 工廠方法構成 : 
    一個抽象產品類,可以派生出多個具體產品類. 
    一個抽象工廠類,可以派生出多個具體工廠類. 
    每個具體工廠類只能建立一個具體產品類的例項.

  • 抽象工廠模式構成: 
    多個抽象產品類,每個抽象產品類可以派生出多個具體產品類. 
    一個抽象工廠類,可以派生出多個具體工廠類. 
    每個具體工廠類可以建立多個具體產品類的例項.

最後 :

設計模式重在理解 , 儘可能用最通俗的例子來闡述我所理解的設計模式 , 可能有理解不當的地方 , 見諒

相關文章