定义
将一个复杂对象的构建与它的实例分离,使得同样的构建过程可以创建不同的实例。
建造者模式实现
比如你打算装修一个房子,首先你会找到开发商提出你的需求
/** * @information: 业主 */ class Owner { constructor (need){ this.need = need || []; } getNeed() { return this.need; } }
然后开发商会根据你的需求去找设计师设计图纸
/** * @information: 开发商 */ class Developer { constructor(need) { this.need = need || []; console.log("我需要这样的房间:"+need); } construct() { console.log("开始建造"); let workerOk = this.need.map(el => { let builder = new CreatDiagram(); builder.build(el); return builder.getResult(); }); console.log("房子不错"); console.log(workerOk); } } /** * @information: 设计图抽象类 */ class Diagram { constructor(){ console.log("拿到图纸"); } build (partName){ console.log(`观察${partName}图纸`); } }
拿到图纸之后,再招工人
/** * @information: 工人类 */ class Worker { constructor (material) { console.log(`我建造了${material}`); this.data = material; } } /** * @information: 设计图实现 */ class CreatDiagram extends Diagram { constructor() { super(); } build (partName) { super.build(partName); console.log(`建造开始${partName}`); this.worker = new Worker(partName); } getResult() { console.log("完工"); return this.worker; } }
最后就开始装修了
let owner = new Owner([‘卧室‘, ‘厨房‘, ‘客厅‘]); let home = new Developer(owner.getNeed()); home.construct();
具体打印结果如下
建造者模式的优缺点
优点
- 在建造者模式里,不需要知道建造的过程是怎么样的,创建的实例会与过程解耦。
- 建造者模式里可以根据不同的具体实现来得到不同的实例。
- 每个具体的建造类都相对独立,方便替换和新增。
缺点
- 如果类内部的差异比较大,或者变化复杂的话,会增加很多对应的实现类,使得代码比较臃肿。
总结
建造者模式返回的是各种类组装好的一个对象,各有各的应用场景,建造者模式可以比较适用那些有固定生成顺序的对象。