JavaScript设计模式「基于ES2024」:创建型模式-建造者模式

77 阅读2分钟

建造者模式使得我们可以分步骤创建复杂对象,这种模式特别适用于需要创建的对象有多个部分,或者创建过程涉及多个步骤的情况。

class Computer {
    constructor(builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
        this.gpu = builder.gpu;
    }

    getSpecs() {
        return `Computer Specs:
            CPU: ${this.cpu}
            RAM: ${this.ram}GB
            Storage: ${this.storage}GB
            GPU: ${this.gpu}`;
    }
}

class ComputerBuilder {
    #cpu;
    #ram;
    #storage;
    #gpu;

    constructor() {
        this.reset();
    }

    reset() {
        this.#cpu = '';
        this.#ram = 0;
        this.#storage = 0;
        this.#gpu = '';
        return this;
    }

    setCPU(cpu) {
        this.#cpu = cpu;
        return this;
    }

    setRAM(ram) {
        this.#ram = ram;
        return this;
    }

    setStorage(storage) {
        this.#storage = storage;
        return this;
    }

    setGPU(gpu) {
        this.#gpu = gpu;
        return this;
    }

    build() {
        const computer = new Computer(this);
        this.reset();
        return computer;
    }

    get cpu() { return this.#cpu; }
    get ram() { return this.#ram; }
    get storage() { return this.#storage; }
    get gpu() { return this.#gpu; }
}

class ComputerDirector {
    static buildGamingPC(builder) {
        return builder
            .setCPU('Intel i9')
            .setRAM(32)
            .setStorage(1000)
            .setGPU('NVIDIA RTX 3080')
            .build();
    }

    static buildOfficePC(builder) {
        return builder
            .setCPU('Intel i5')
            .setRAM(16)
            .setStorage(512)
            .setGPU('Integrated Graphics')
            .build();
    }
}

// 使用示例
const builder = new ComputerBuilder();

// 使用 Director 创建预定义配置
const gamingPC = ComputerDirector.buildGamingPC(builder);
console.log(gamingPC.getSpecs());

const officePC = ComputerDirector.buildOfficePC(builder);
console.log(officePC.getSpecs());

// 自定义配置
const customPC = builder
    .setCPU('AMD Ryzen 7')
    .setRAM(64)
    .setStorage(2000)
    .setGPU('AMD Radeon RX 6800')
    .build();
console.log(customPC.getSpecs());

实现思路

  • 复杂对象 Computer:

    • 该类代表我们要创建的复杂对象。它包含多个属性(CPU、RAM、存储、GPU),并通过构造函数接受一个 ComputerBuilder 实例来初始化这些属性。
    • getSpecs 方法用于输出计算机的规格说明。
  • 建造者类 ComputerBuilder:

    • ComputerBuilder 使用私有字段(#cpu, #ram, #storage, #gpu)来存储构建过程中的计算机属性。
    • 提供了一系列设置属性的方法(如 setCPU, setRAM, setStorage, setGPU),每个方法都返回 this,以支持链式调用。
    • build 方法创建并返回一个新的 Computer 实例,同时调用 reset 方法重置建造者,以便可以重复使用。
    • reset 方法初始化或重置所有属性字段。
  • 导演类 ComputerDirector:

    • ComputerDirector 提供了一些预定义的构建方法(如 buildGamingPC, buildOfficePC),用于创建特定配置的计算机。
    • 每个构建方法都接受一个 ComputerBuilder 实例,并调用一系列设置方法来配置计算机的各个属性,最后调用 build 方法返回最终的 Computer 对象。

使用示例

  • 首先,创建一个 ComputerBuilder 实例。
  • 使用 ComputerDirector 提供的预定义方法(如 buildGamingPC, buildOfficePC)来创建特定配置的计算机。
  • 直接使用 ComputerBuilder 创建自定义配置的计算机。

优点

  • 分步构造:允许逐步构建复杂对象,每一步都可以细化。
  • 代码复用:相同的构建过程可以创建不同的表示。
  • 单一职责原则:将复杂对象的构建代码从其表示中分离出来。
  • 灵活性:允许动态决定对象的内部表示。