《设计模式》 - 3. 创建者模式( Builder )

创建者模式 ( 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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值