一、定义
建造者模式又叫生成器模式,将一个复杂对象的构建与它的表示分离(即产品与产品的创建过程解耦),使得同样的构建过程可以创建不同的表示。

二、类图

Product(产品角色):一个具体的产品对象 Builder(抽象建造者):创建一个Product对象的各个部件制定的接口、抽象类 ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。 Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
三、优点
- 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的构建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每一个具体建造者都是相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或者增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
- 可以更加精细地控制产品的创建过程。
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者编程,系统扩展方便,符合“开闭原则”
四、缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似, 如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
五、使用场景
建造者模式要求按照指定的蓝图建造产品,主要目的是通过组装零配件而产生一个新产品。这就需要生成的产品对象有复杂的内部结构,产品对象具备共性,通过隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
六、代码实现
// 抽象建造者
abstract class Builder {
public abstract buildPartA() : void;
public abstract buildPartB() : void;
public abstract buildPartC() : void;
public abstract buildProduct() : Product;
}
// 具体建造者
class ConcreteBuilder extends Builder {
private product : Product;
constructor(product : Product) {
super();
this.product = product;
}
public buildPartA() : void {}
public buildPartB() : void {}
public buildPartC() : void {}
// 最终组建一个产品
public buildProduct() : Product {
return this.product;
}
}
// 产品角色
class Product {
public doSomething() : void {
// 独立业务
}
}
// 指挥者
class Director {
private _builder : Builder;
constructor(builder : Builder) {
this._builder = builder;
}
set builder(builder : Builder) {
this._builder = builder;
}
// 将处理建造的流程交给指挥者
public constructorProduct() {
this._builder.buildPartA();
this._builder.buildPartB();
this._builder.buildPartC();
return this._builder.buildProduct();
}
}
// 使用
const builder : Builder = new ConcreteBuilder(new Product());
const director : Director = new Director(builder);
const product : Product = director.constructorProduct();
欢迎大家关注公众号
