参考文章:
java设计模式之建造者模式javascript
1、什么是建造者模式
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。
工厂类模式提供的是建立单个类的模式,而建造者模式则是将各类产品集中起来进行管理,用来建立复合对象,所谓复合对象就是指某个类具备不一样的属性。html
具体表现为4个角色
产品(Product):建造的产物
导演(Director):指挥建造的过程,不涉及建造的细节
建造者(Builder):抽象建造过程,规定产品哪些部分须要建立
具体建造者(ConceteBuilder):实现Builder,实现产品各个部分的建造,并提供产品java
使用场景:
须要生成的对象有复杂的内部结构,且各部分都会根据需求发生组装变化
缺点:
一、当产品内部很是复杂,须要用大量的具体建造者,致使系统庞大
二、产品要有共同点,范围受限制设计模式
下面举个例子:肯德基点餐环节,角色对应分别以下
Product:一餐食物(Meal)
Director:前台销售员(Seller)
Builder:抽象建造者(Builder)
ConceteBuilder:厨师(Cook)ui
首先实现一些食物this
// Food 食物抽象类 class Food { constructor() { this.name = null; this.price = null; } } // 汉堡 class Burger extends Food { constructor() { super(); this.name = '汉堡'; this.price = 16; } } // 鸡翅 class ChickenWing extends Food { constructor() { super(); this.name = '鸡翅'; this.price = 12; } } // 可乐 class Coke extends Food { constructor() { super(); this.name = '可乐'; this.price = 6; } }
产品Product
一桌餐饭能够有任意数量的任意组合设计
// Product class Meal { constructor() { this.foods = []; } addFood(item) { this.foods.push(item); } showPrice() { var i = this.foods.length, price = 0; while(i--) { price += this.foods[i].price; } return price; } }
抽象建造类Builder
规范各部分的建造code
// Builder class Builder { cookBurger() {} cookWing() {} cookCoke() {} finishCook() {} }
具体建造类
厨师负责各个食物的烹饪,并添加到meal里htm
// ConceteBuilder class Cook extends Builder { constructor() { super(); this.meal = new Meal(); } cookBurger(number) { for (var i = 0; i < number; i++) { this.meal.addFood(new Burger()); } } cookWing(number) { for (var i = 0; i < number; i++) { this.meal.addFood(new ChickenWing()); } } cookCoke(number) { for (var i = 0; i < number; i++) { this.meal.addFood(new Coke()); } } finishCook() { return this.meal; } }
导演Director
负责通知厨房须要烹饪啥啥啥。对象
// Director class Seller { constructor() { this.builder = null; } bindCook(builder) { this.builder = builder; } placeOrder(burgerAmount, wingAmount, cokeAmount) { this.builder.cookBurger(burgerAmount); this.builder.cookWing(wingAmount); this.builder.cookCoke(cokeAmount); var meal = this.builder.finishCook(); console.log('总价:' + meal.showPrice()); return meal; } }
最后模拟一次下单场景
var seller = new Seller(); var cook = new Cook(); seller.bindCook(cook); seller.placeOrder(1, 2, 3); // 58
总结:
易于解耦
将产品自己与产品建立过程进行解耦,能够使用相同的建立过程来获得不一样的产品。也就说细节依赖抽象。
易于精确控制对象的建立
将复杂产品的建立步骤分解在不一样的方法中,使得建立过程更加清晰
易于拓展 增长新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。