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