一、定义
是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
主要流程:
客户提出需求→指挥者根据用户需求,指挥建造者去完成需求的各个部分→建造者完成相应的部分
主要有4个部分:product产品类、Builder建造者类、Director指挥者类、客户。
使用场景:
需要生成的对象具有复杂得内部结构;且内部属性本身相互依赖
与工厂模式的区别:
工厂模式:关注的是创建的结果,提供的是创建单个类的模式;
建造者模式:不仅得到了结果,同时也参与了创建的具体过程,适合用来创建一个复杂的复合对象。
二、举例
eg1: github上面原有的例子(https://github.com/sohamkamani/javascript-design-patterns-for-humans#-template-method),根据主要流程稍作了修改。
// 产品: 汉堡
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(); // 完成汉堡制作