建造者模式
理解设计模式(一)——简单工厂
理解设计模式(二)——工厂方法
写在前面
许多时候,一个复杂对象往往是由许多个简单对象组合而成的。在创建这个复杂对象的过程中,我们可以一步一步,逐渐向对象中添加所需要的部分,最终形成一个完整的对象。
那么我们为什么不一步到位直接new一个对象呢?我们来比较一下这两种方法。
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();
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模式。
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就替换创建的对象。代码少了灵活性。