《設計模式》 - 3. 建立者模式( Builder )

Cleve_baby發表於2018-07-06

Javascript設計模式 - 原文連結

建立者模式 ( Builder ) :

語言 : JavaScript

說明 :

以KFC的套餐為例 ,每種套餐包含(主食 、副食 、飲料)三種食物 , 假設 1 位廚師(Cook)只會製作 1 種套餐(Meal) , 我們需要根據套餐選擇廚師 .

導演類( Dirctor ) :

導演類規定套餐的基本組成 , 分為主食 、副食 、飲料3個部分 .

var Dirctor = cc.Class.extend({
    makeMeal: function(Cook){
        Cook.createPart1();     //主食
        Cook.createPart2();     //副食
        Cook.createPart3();     //飲料
    }
});

產品類( Meal ) :

var Meal = cc.Class.extend({
    Foods: null,
    ctor: function(){
        this.Foods = new Object();
    },

    addFoods: function(type, num){
        this.Foods[type] = num;
    },

    showMeal: function(){
        console.log(this.Foods);
    }

});

建立者類( Cook ) :

// 父類 - 廚師(Cook) 含有三個抽象方法,需要由子類繼承實現
var Cook = cc.Class.extend({
    meal: null,
    ctor: function(){
        this.meal = new Meal();
    },
    createPart1: function(){

    },
    createPart2: function(){

    },
    createPart3: function(){

    },
    getMeal: function(){
        return this.meal;
    }
});

//子類 - (廚師A、廚師B), 廚師A、廚師B分別會製作不同的套餐.
var A_Cook = Cook.extend({
    createPart1: function(){
        this.meal.addFoods("雞肉卷", 2);
    },
    createPart2: function(){
        this.meal.addFoods("薯條", 1);
    },
    createPart3: function(){
        this.meal.addFoods("橙汁", 2);
    }
});

var B_Cook = Cook.extend({
    createPart1: function(){
        this.meal.addFoods("漢堡", 1);
        this.meal.addFoods("雞米花", 1);
    },
    createPart2: function(){
        this.meal.addFoods("冰淇淋", 2);
    },
    createPart3: function(){
        this.meal.addFoods("咖啡", 2);
    }
});

客戶類( Client ) :


var Client = cc.Class.extend({
    buyFoods: function(type){
        var cook = this.selectCook(type);   //挑選廚師
        var dirctor = new Dirctor();        //建立導演類
        dirctor.makeMeal(cook);             //導演類按照規定指定廚師製作套餐
        cook.getMeal().showMeal();          //廚師製作完成
    },

    selectCook: function(type){
        switch (type)
        {
            case "A":
                return new A_Cook();
            case "B":
                return new B_Cook();
        }
    }
});

// 客戶  購買套餐
var client = new Client();
client.buyFoods("A");
client.buyFoods("B");

輸出結果 : 
這裡寫圖片描述

優點 :

建立者模式的封裝性很好 , 通常情況下產品類和建立者類是穩定的 , 需求變化時候也很容易修改 , 只需要新增新的建立者 - 廚師(Cook) , 本模式也很好的遵循了open & close 設計原則 .

區別 :

仔細一看建立者模式 和 工廠模式非常類似 , 唯一不同的地方是 建立者模式多出了一個導演類(Dirctor) , 導演類確定了大致的組成框架 , 對於建立更為複雜的物件的情況時 , 可以讓結構變得清晰.

總結 :

總得來說 , 建立型模式的作用都是類似的 , 模式與模式之間肯定是存在相似點的 , 如果要用一句話對建立者模式總結的話 , 那就是 :

如果建立的物件複雜 - 使用工廠模式(Factory) 
如果建立的物件非常複雜 - 使用建立者模式(Builder)

相關文章