什么是建造者模式?
建造者模式是把简单对象构造成复杂对象的一种模式。 它也是一种创建型的设计模式,只不过它的产物一般是一个复杂的对象,而且这个对象在组合构建时是可变的。
什么时候使用建造者模式?
上边说到建造者模式的功能是用来创建复杂对象。如果一个对象是有多个可变的属性组成,且根据场景不同,这些属性的值是可变的,那么如果只靠传参来控制一定是一件非常头疼的事。这个时候就可以考虑使用建造者模式简化创建过程,同时使对象的创建过程变得更可控。
比如说,现在老王有个施工队,这个施工队负责到处给别人搞建筑,但是因为接到的活儿不一样,所以盖出来的建筑肯定也不一样。不过对于一般的建筑来说,前期的一些建筑工作基本上可能都差不多,都是先打地基,然后砌墙,最后封顶。但是有的客户可能还会让他们帮忙修修厕所,搞搞排水渠,最后整整院子啥的。 所以在整个建造的过程中是可变的,且根据土地面积,建筑材料,建筑风格等不同,最后产出的建筑物也是各不相同的。
如何灵活又清楚地表示这个建造过程呢?
class BuildHouse {
constructor(long, width, height) {
this.long = long; // 地基长
this.width = width; // 地基宽
this.height = height; // 墙高
}
basicBuild() {
this.buildFoundation().buildWall().buildRoof();
return this;
}
// 修建地基
buildFoundation() {
console.log("Building the foundation, size: " + this.long + "m * " + this.width + "m.");
return this;
}
// 修建墙
buildWall() {
console.log("Building the wall, height: " + this.height + "m.");
return this;
}
// 修建房顶
buildRoof() {
console.log("Building the roof.");
return this;
}
// 修建洗手间
buildWashroom() {
console.log("Building the washroom.");
return this;
}
// 修建排水道
buildSewer() {
console.log("Building the sewer.");
return this;
}
// 修建院子
buildYard(x, y) {
console.log("Building the yard, size: " + x + "m * " + y + "m.");
return this;
}
}
new BuildHouse(20, 5, 4)
.basicBuild()
.buildSewer()
.buildWashroom()
.buildYard(20,10)
在上边的例子中我们采用了链式调用的方式进行封装,这也是在使用建造者模式时最常用的编程方式。这样做的好处有两个,一个是我们可以很方便的通过修改调用时的顺序来控制对象的创建过程。像建造一个房子,一定是先修建地基再修建墙体,这个过程比较严格,但是其他的建造顺序就是比较灵活可变的。链式调用的另一个好处是可以灵活控制建造程度。像我们上边调用创建房子的过程,如果不想修建院子,只需要将那行代码注释,很方便维护。
new BuildHouse(20, 5, 4)
.basicBuild()
.buildSewer()
.buildWashroom()
// .buildYard(20,10)
总结
建造者模式主要用来分离复杂对象的构建和表示。建造者模式的特征是同样的构建过程可以创建不同的表示。在上边的例子中,每个建造环节的内部还可以进一步对这个建造过程再进行具体的封装和设计。在此就不做展开了。