參考文章:
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
總結:
易於解耦
將產品自己與產品建立過程進行解耦,能夠使用相同的建立過程來獲得不一樣的產品。也就說細節依賴抽象。
易於精確控制對象的建立
將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰
易於拓展 增長新的具體建造者無需修改原有類庫的代碼,易於拓展,符合「開閉原則「。