设计模式——建造者模式(TypeScript版)

一、定义

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

设计模式——建造者模式(TypeScript版)_第1张图片

二、类图

设计模式——建造者模式(TypeScript版)_第2张图片

Product(产品角色):一个具体的产品对象
Builder(抽象建造者):创建一个Product对象的各个部件制定的接口、抽象类
ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。
Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

三、优点

  1. 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的构建过程解耦,使得相同的创建过程可以创建不同的产品对象
  2. 每一个具体建造者都是相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或者增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
  3. 可以更加精细地控制产品的创建过程。
  4. 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者编程,系统扩展方便,符合“开闭原则”

四、缺点

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似, 如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

五、使用场景

建造者模式要求按照指定的蓝图建造产品,主要目的是通过组装零配件而产生一个新产品。这就需要生成的产品对象有复杂的内部结构,产品对象具备共性,通过隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

六、代码实现

// 抽象建造者
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();

欢迎大家关注公众号

你可能感兴趣的:(设计模式——建造者模式(TypeScript版))