摘要:參考文章設計模式之建造者模式一什么是建造者模式建造者模式是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
參考文章:
java設計模式之建造者模式
一、什么是建造者模式
建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來創建復合對象,所謂復合對象就是指某個類具有不同的屬性。
具體表現為4個角色
產品(Product):建造的產物
導演(Director):指揮建造的過程,不涉及建造的細節
建造者(Builder):抽象建造過程,規定產品哪些部分需要創建
具體建造者(ConceteBuilder):實現Builder,實現產品各個部分的建造,并提供產品
使用場景:
需要生成的對象有復雜的內部結構,且各部分都會根據需求發生組裝變化
缺點:
1、當產品內部非常復雜,需要用大量的具體建造者,導致系統龐大
2、產品要有共同點,范圍受限制
下面舉個例子:肯德基點餐環節,角色對應分別如下
Product:一餐食物(Meal)
Director:前臺銷售員(Seller)
Builder:抽象建造者(Builder)
ConceteBuilder:廚師(Cook)
首先實現一些食物
// 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
規范各部分的建造
// Builder class Builder { cookBurger() {} cookWing() {} cookCoke() {} finishCook() {} }
具體建造類
廚師負責各個食物的烹飪,并添加到meal里
// 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
總結:
易于解耦
將產品本身與產品創建過程進行解耦,可以使用相同的創建過程來得到不同的產品。也就說細節依賴抽象。
易于精確控制對象的創建
將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰
易于拓展
增加新的具體建造者無需修改原有類庫的代碼,易于拓展,符合“開閉原則“。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93777.html
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的...
摘要:注意事項聲明函數時候處理業務邏輯區分和單例的區別,配合單例實現初始化構造函數大寫字母開頭推薦注意的成本。簡單工廠模式使用一個類通常為單體來生成實例。 @(書籍閱讀)[JavaScript, 設計模式] 常見設計模式 一直對設計模式不太懂,花了一下午加一晚上的時間,好好的看了看各種設計模式,并總結了一下。 設計模式簡介 設計模式概念解讀 設計模式的發展與在JavaScript中的應用 ...
摘要:建造者模式實現建造者模式實現創建抽象建造者類創建具體建造者類。建造者模式使用場景建造者模式使用場景相同的方法,不同的執行順序,產生不同的事件結果時,可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...
摘要:建造者實現抽象類的所有未實現的方法,具體來說一般是兩項任務組建產品返回組建好的產品。 0x01.定義與類型 定義:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細節不需要知道 類型:創建型 實現建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
閱讀 2538·2023-04-26 00:57
閱讀 911·2021-11-25 09:43
閱讀 2221·2021-11-11 16:55
閱讀 2206·2019-08-30 15:53
閱讀 3592·2019-08-30 15:52
閱讀 1459·2019-08-30 14:10
閱讀 3379·2019-08-30 13:22
閱讀 1209·2019-08-29 11:18