建造者模式

74 阅读1分钟

建造者模式

建造者模式,用于构造复杂对象的步骤分离,使得相同的构造过程可以创建不同的表示。常用于处理那些需要多个部分组合成一个对象的情况,特别是当对象的创建过程需要多个步骤,且每个步骤根据特定的顺序和逻辑进行时。

案例分析:

构建不同品牌的电脑。

class Computer {
    private cpu: string;
    private ram: string;
    private usbCount: number;
    private keyboard: string;
    private display: string;
  
    constructor(cpu: string, ram: string) {
        this.cpu = cpu;
        this.ram = ram;
    }
​
    setUsbCount(usbCount: number) {
        this.usbCount = usbCount;
    }
​
    setKeyboard(keyboard: string) {
        this.keyboard = keyboard;
    }
​
    setDisplay(display: string) {
        this.display = display;
    }
​
    toString(): string {
        return `Computer{cpu='${this.cpu}', ram='${this.ram}', usbCount=${this.usbCount}, keyboard='${this.keyboard}', display='${this.display}'}`;
    }
}
​
abstract class ComputerBuilder {
    abstract setUsbCount(): void;
    abstract setKeyboard(): void;
    abstract setDisplay(): void;
​
    abstract getComputer(): Computer;
}
​
class MacComputerBuilder extends ComputerBuilder {
    private computer: Computer;
​
    constructor(cpu: string, ram: string) {
        super();
        this.computer = new Computer(cpu, ram);
    }
​
    setUsbCount() {
        this.computer.setUsbCount(2);
    }
​
    setKeyboard() {
        this.computer.setKeyboard("苹果键盘");
    }
​
    setDisplay() {
        this.computer.setDisplay("苹果显示器");
    }
​
    getComputer(): Computer {
        return this.computer;
    }
}
​
class LenovoComputerBuilder extends ComputerBuilder {
    private computer: Computer;
​
    constructor(cpu: string, ram: string) {
        super();
        this.computer = new Computer(cpu, ram);
    }
​
    setUsbCount() {
        this.computer.setUsbCount(4);
    }
​
    setKeyboard() {
        this.computer.setKeyboard("联想键盘");
    }
​
    setDisplay() {
        this.computer.setDisplay("联想显示器");
    }
​
    getComputer(): Computer {
        return this.computer;
    }
}
​
class ComputerDirector {
    makeComputer(builder: ComputerBuilder) {
        builder.setUsbCount();
        builder.setKeyboard();
        builder.setDisplay();
    }
}
​
// 客户端使用示例
const director = new ComputerDirector();
const macBuilder = new MacComputerBuilder("I5处理器", "三星125");
director.makeComputer(macBuilder);
const macComputer = macBuilder.getComputer();
console.log("mac computer:", macComputer.toString());
​
const lenovoBuilder = new LenovoComputerBuilder("I7处理器", "海力士222");
director.makeComputer(lenovoBuilder);
const lenovoComputer = lenovoBuilder.getComputer();
console.log("lenovo computer:", lenovoComputer.toString());
​

建造者模式使得添加新的具体建造者变得非常容易,以支持新的计算机品牌,而不需要修改现有的类。例如,如果要添加一个构建Dell品牌计算机的建造者,只需创建一个新的建造者类DellComputerBuilder,实现相应的构建逻辑即可。