TypeScript 设计模式 - 建造者模式

69 阅读1分钟

建造者模式

展示如何用它创建复杂对象,同时保持创建过程的灵活性和可读性。

示例

产品类

// 定义一个复杂对象
class House {
    public walls: string = '';
    public roof: string = '';
    public windows: string = '';

    show(): void {
        console.log(`House with Walls: ${this.walls}, Roof: ${this.roof}, Windows: ${this.windows}`);
    }
}

建造者接口

// 定义建造者接口
interface HouseBuilder {
    buildWalls(): void;
    buildRoof(): void;
    buildWindows(): void;
    getResult(): House;
}

具体建造者

// 具体建造者实现
class ConcreteHouseBuilder implements HouseBuilder {
    private house: House;

    constructor() {
        this.house = new House();
    }

    buildWalls(): void {
        this.house.walls = 'Brick Walls';
    }

    buildRoof(): void {
        this.house.roof = 'Concrete Roof';
    }

    buildWindows(): void {
        this.house.windows = 'Glass Windows';
    }

    getResult(): House {
        return this.house;
    }
}

指挥者

// 定义指挥者类
class HouseDirector {
    private builder: HouseBuilder;

    constructor(builder: HouseBuilder) {
        this.builder = builder;
    }

    construct(): void {
        this.builder.buildWalls();
        this.builder.buildRoof();
        this.builder.buildWindows();
    }
}

使用示例

function main() {
    const builder = new ConcreteHouseBuilder();
    const director = new HouseDirector(builder);

    director.construct();
    const house = builder.getResult();
    house.show(); // 输出: House with Walls: Brick Walls, Roof: Concrete Roof, Windows: Glass Windows
}

main();

关键点解析

  1. 产品类 (House)

    • 定义了最终要创建的复杂对象及其属性。
  2. 建造者接口 (HouseBuilder)

    • 定义了构建对象各部分的方法。
  3. 具体建造者 (ConcreteHouseBuilder)

    • 实现了建造者接口,负责具体的创建逻辑。
  4. 指挥者 (HouseDirector)

    • 调用建造者的方法,按特定顺序构建对象。
  5. 分离复杂创建逻辑

    • 客户端代码通过指挥者控制对象创建,而无需关心具体实现。

应用场景

  • 创建复杂对象(如车辆、房屋、游戏角色)。
  • 分步构建对象,支持灵活调整或配置(如表单生成器、文档生成器)。