建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它允许你创建一个复杂对象的表示,同时隐藏了构建的细节。它将构建过程与最终表示分离,使得相同的构建过程可以创建不同的表示。
建造者模式通常包含以下角色:
-
产品(Product): 表示被构建的复杂对象。具体的构建过程会创建不同的产品实例。
-
抽象建造者(Builder): 定义了构建产品的接口,包括构建每个部分的方法。
-
具体建造者(Concrete Builder): 实现了抽象建造者接口,负责实际构建产品的每个部分。具体建造者通常有一个与产品相关的实例,并将其组装成最终产品。
-
指导者(Director): 负责调用具体建造者来构建产品。指导者通常不直接创建产品,而是通过调用建造者的方法来实现。
以下是一个简单的 JavaScript 示例,演示了建造者模式:
// 产品
class Car {
constructor() {
this.parts = [];
}
addPart(part) {
this.parts.push(part);
}
showInfo() {
console.log(`Car Parts: ${this.parts.join(', ')}`);
}
}
// 抽象建造者
class Builder {
buildPart1() {}
buildPart2() {}
buildPart3() {}
getResult() {}
}
// 具体建造者A
class ConcreteBuilderA extends Builder {
constructor() {
super();
this.car = new Car();
}
buildPart1() {
this.car.addPart('PartA1');
}
buildPart2() {
this.car.addPart('PartA2');
}
getResult() {
return this.car;
}
}
// 具体建造者B
class ConcreteBuilderB extends Builder {
constructor() {
super();
this.car = new Car();
}
buildPart1() {
this.car.addPart('PartB1');
}
buildPart3() {
this.car.addPart('PartB3');
}
getResult() {
return this.car;
}
}
// 指导者
class Director {
construct(builder) {
builder.buildPart1();
builder.buildPart2();
builder.buildPart3();
return builder.getResult();
}
}
// 客户端代码
const director = new Director();
const builderA = new ConcreteBuilderA();
const productA = director.construct(builderA);
productA.showInfo();
// Output: Car Parts: PartA1, PartA2
const builderB = new ConcreteBuilderB();
const productB = director.construct(builderB);
productB.showInfo();
// Output: Car Parts: PartB1, PartB3
在这个例子中,Car
是产品,Builder
是抽象建造者,ConcreteBuilderA
和 ConcreteBuilderB
是具体建造者,Director
是指导者。Director
负责指导具体建造者来构建产品。每个具体建造者负责实现产品的构建过程,并通过 getResult
方法返回最终的产品。
建造者模式的优点包括:
- 隔离构建过程和最终表示: 客户端只需关心最终产品的表示,而不需要了解构建的细节。
- 灵活性: 可以通过不同的具体建造者来创建不同的产品表示。
- 复用性: 可以复用相同的构建过程来构建不同的产品。
建造者模式在需要构建复杂对象,且构建过程有一定步骤和顺序的场景中非常有用。