理解设计模式(四)——建造者模式

建造者模式

理解设计模式(一)——简单工厂 理解设计模式(二)——工厂方法

写在前面

许多时候,一个复杂对象往往是由许多个简单对象组合而成的。在创建这个复杂对象的过程中,我们可以一步一步,逐渐向对象中添加所需要的部分,最终形成一个完整的对象。

那么我们为什么不一步到位直接new一个对象呢?我们来比较一下这两种方法。

// Builder
let builder = new Builder();

let partA = new PartA();
builder.buildPartA(partA);

let partB = new PartB();
builder.buildPartB(partB);

let partC = new PartC();
builder.buildPartC(partC);

let product = builder.getInstance();

// new
let partA = new PartA();
let partB = new PartB();
let partC = new PartC();

let product = new Product(partA, partB, partC);

new的问题

从上面的代码中我们可以看出,如果想要使用new创建,就必须知道要创建的对象的各个具体的部分。

有人会说,builder模式难道不用知道吗?

其实上面的代码不是完整的builder模式,完整的builder模式应该还有一个director对象。下面才是完整的builder模式。

// Builder
class Director {
constructor(builder) {
this.builder = builder;
}

setBuilder(builder) {
this.builder = builder;
}

getProduct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getInstance();
}
}

let builder = new Builder();
let director = new Director(builder);
let product = director.getProduct();

这样子,可以为每个具体的产品创建一个具体的builder,而用户使用时只需要指明使用哪个builder,不需要知道要创建的对象的具体部分。

思考 new 为什么不可以?

建造者模式,重点不在它分步骤创建对象,而是在于只要给Director指定一个新的Builder,就能创建出一个新的对象。

如果在Director中直接写new Product(partA, partB, partC),那就没办法做到替换Builder就替换创建的对象。代码少了灵活性。

Author: LeoB_O
Link: https://leob-o.github.io/2019/05/30/BuilderPattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.