摘要:參考文章設(shè)計(jì)模式之建造者模式一什么是建造者模式建造者模式是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
參考文章:
java設(shè)計(jì)模式之建造者模式
一、什么是建造者模式
建造者模式:是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
工廠類(lèi)模式提供的是創(chuàng)建單個(gè)類(lèi)的模式,而建造者模式則是將各種產(chǎn)品集中起來(lái)進(jìn)行管理,用來(lái)創(chuàng)建復(fù)合對(duì)象,所謂復(fù)合對(duì)象就是指某個(gè)類(lèi)具有不同的屬性。
具體表現(xiàn)為4個(gè)角色
產(chǎn)品(Product):建造的產(chǎn)物
導(dǎo)演(Director):指揮建造的過(guò)程,不涉及建造的細(xì)節(jié)
建造者(Builder):抽象建造過(guò)程,規(guī)定產(chǎn)品哪些部分需要?jiǎng)?chuàng)建
具體建造者(ConceteBuilder):實(shí)現(xiàn)Builder,實(shí)現(xiàn)產(chǎn)品各個(gè)部分的建造,并提供產(chǎn)品
使用場(chǎng)景:
需要生成的對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu),且各部分都會(huì)根據(jù)需求發(fā)生組裝變化
缺點(diǎn):
1、當(dāng)產(chǎn)品內(nèi)部非常復(fù)雜,需要用大量的具體建造者,導(dǎo)致系統(tǒng)龐大
2、產(chǎn)品要有共同點(diǎn),范圍受限制
下面舉個(gè)例子:肯德基點(diǎn)餐環(huán)節(jié),角色對(duì)應(yīng)分別如下
Product:一餐食物(Meal)
Director:前臺(tái)銷(xiāo)售員(Seller)
Builder:抽象建造者(Builder)
ConceteBuilder:廚師(Cook)
首先實(shí)現(xiàn)一些食物
// Food 食物抽象類(lèi) 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; } } // 可樂(lè) class Coke extends Food { constructor() { super(); this.name = "可樂(lè)"; this.price = 6; } }
產(chǎn)品Product
一桌餐飯可以有任意數(shù)量的任意組合
// 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; } }
抽象建造類(lèi)Builder
規(guī)范各部分的建造
// Builder class Builder { cookBurger() {} cookWing() {} cookCoke() {} finishCook() {} }
具體建造類(lèi)
廚師負(fù)責(zé)各個(gè)食物的烹飪,并添加到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; } }
導(dǎo)演Director
負(fù)責(zé)通知廚房需要烹飪啥啥啥。
// 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("總價(jià):" + meal.showPrice()); return meal; } }
最后模擬一次下單場(chǎng)景
var seller = new Seller(); var cook = new Cook(); seller.bindCook(cook); seller.placeOrder(1, 2, 3); // 58
總結(jié):
易于解耦
將產(chǎn)品本身與產(chǎn)品創(chuàng)建過(guò)程進(jìn)行解耦,可以使用相同的創(chuàng)建過(guò)程來(lái)得到不同的產(chǎn)品。也就說(shuō)細(xì)節(jié)依賴(lài)抽象。
易于精確控制對(duì)象的創(chuàng)建
將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過(guò)程更加清晰
易于拓展
增加新的具體建造者無(wú)需修改原有類(lèi)庫(kù)的代碼,易于拓展,符合“開(kāi)閉原則“。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/93777.html
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的...
摘要:如何應(yīng)對(duì)這種變化如何提供一種封裝機(jī)制來(lái)隔離出復(fù)雜對(duì)象的各個(gè)部分的變化,從而保持系統(tǒng)中的穩(wěn)定構(gòu)建算法不隨著需求改變而改變這就是要說(shuō)的建造者模式。建造者模式,將一個(gè)復(fù)雜對(duì)象的構(gòu)建層與其表示層相互分離,使得同樣的構(gòu)建過(guò)程可以采用不同的表示。 1. 簡(jiǎn)介 在軟件系統(tǒng)中,有時(shí)候面臨著一個(gè)復(fù)雜對(duì)象的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著...
摘要:注意事項(xiàng)聲明函數(shù)時(shí)候處理業(yè)務(wù)邏輯區(qū)分和單例的區(qū)別,配合單例實(shí)現(xiàn)初始化構(gòu)造函數(shù)大寫(xiě)字母開(kāi)頭推薦注意的成本。簡(jiǎn)單工廠模式使用一個(gè)類(lèi)通常為單體來(lái)生成實(shí)例。 @(書(shū)籍閱讀)[JavaScript, 設(shè)計(jì)模式] 常見(jiàn)設(shè)計(jì)模式 一直對(duì)設(shè)計(jì)模式不太懂,花了一下午加一晚上的時(shí)間,好好的看了看各種設(shè)計(jì)模式,并總結(jié)了一下。 設(shè)計(jì)模式簡(jiǎn)介 設(shè)計(jì)模式概念解讀 設(shè)計(jì)模式的發(fā)展與在JavaScript中的應(yīng)用 ...
摘要:建造者模式實(shí)現(xiàn)建造者模式實(shí)現(xiàn)創(chuàng)建抽象建造者類(lèi)創(chuàng)建具體建造者類(lèi)。建造者模式使用場(chǎng)景建造者模式使用場(chǎng)景相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...
摘要:建造者實(shí)現(xiàn)抽象類(lèi)的所有未實(shí)現(xiàn)的方法,具體來(lái)說(shuō)一般是兩項(xiàng)任務(wù)組建產(chǎn)品返回組建好的產(chǎn)品。 0x01.定義與類(lèi)型 定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 用戶(hù)只需指定需要建造的類(lèi)型就可以得到他們,建造過(guò)程及細(xì)節(jié)不需要知道 類(lèi)型:創(chuàng)建型 實(shí)現(xiàn)建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
閱讀 2619·2023-04-26 00:57
閱讀 974·2021-11-25 09:43
閱讀 2285·2021-11-11 16:55
閱讀 2364·2019-08-30 15:53
閱讀 3656·2019-08-30 15:52
閱讀 1530·2019-08-30 14:10
閱讀 3435·2019-08-30 13:22
閱讀 1264·2019-08-29 11:18