建造者模式使得我们可以分步骤创建复杂对象,这种模式特别适用于需要创建的对象有多个部分,或者创建过程涉及多个步骤的情况。
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方法用于输出计算机的规格说明。
- 该类代表我们要创建的复杂对象。它包含多个属性(CPU、RAM、存储、GPU),并通过构造函数接受一个
-
建造者类
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创建自定义配置的计算机。
优点:
- 分步构造:允许逐步构建复杂对象,每一步都可以细化。
- 代码复用:相同的构建过程可以创建不同的表示。
- 单一职责原则:将复杂对象的构建代码从其表示中分离出来。
- 灵活性:允许动态决定对象的内部表示。