一脚线、定義
是將一個復雜的對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示弥搞。
主要流程:
客戶提出需求→指揮者根據(jù)用戶需求邮绿,指揮建造者去完成需求的各個部分→建造者完成相應的部分
主要有4個部分:product產(chǎn)品類、Builder建造者類攀例、Director指揮者類船逮、客戶。
使用場景:
需要生成的對象具有復雜得內(nèi)部結(jié)構(gòu)粤铭;且內(nèi)部屬性本身相互依賴
與工廠模式的區(qū)別:
工廠模式:關(guān)注的是創(chuàng)建的結(jié)果,提供的是創(chuàng)建單個類的模式挖胃;
建造者模式:不僅得到了結(jié)果,同時也參與了創(chuàng)建的具體過程梆惯,適合用來創(chuàng)建一個復雜的復合對象酱鸭。
二、舉例
eg1: github上面原有的例子(https://github.com/sohamkamani/javascript-design-patterns-for-humans#-template-method)加袋,根據(jù)主要流程稍作了修改凛辣。
// 產(chǎn)品: 漢堡
class Burger {
constructor(builder) {
this.size = builder.size
this.cheeze = builder.cheeze || false
this.pepperoni = builder.pepperoni || false
this.lettuce = builder.lettuce || false
this.tomato = builder.tomato || false
}
}
// 建造者:制作漢堡
class BurgerBuilder {
constructor(size) {
this.size = size
}
addPepperoni() {
this.pepperoni = true
return this
}
addLettuce() {
this.lettuce = true
return this
}
addCheeze() {
this.cheeze = true
return this
}
addTomato() {
this.tomato = true
return this
}
build() {
return new Burger(this)
}
}
// 直接使用
const burger = (new BurgerBuilder(14))
.addPepperoni()
.addLettuce()
.addCheeze()
.addTomato()
.build()
// (按照4個部分來)指揮者:指揮各個工作
class Director () {
this.action = (builder) => {
builder.addPepperoni();
builder.addLettuce();
builder.addCheeze();
builder.addTomato();
}
}
// 客戶使用方法
const burgerBuilder = new BurgerBuilder(14)
const director = new Director()
director.action(burgerBuilder)
var burger= burgerBuilder.build(); // 完成漢堡制作