建造者模式
建造者模式,用于构造复杂对象的步骤分离,使得相同的构造过程可以创建不同的表示。常用于处理那些需要多个部分组合成一个对象的情况,特别是当对象的创建过程需要多个步骤,且每个步骤根据特定的顺序和逻辑进行时。
案例分析:
构建不同品牌的电脑。
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,实现相应的构建逻辑即可。