一天一个设计模式---生成器模式
概念
生成器模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它允许您逐步构造一个对象,将构建过程与最终对象的表示分离开来。这种模式通常用于创建复杂的对象,这些对象可能有多个部分组成,且构建过程可能涉及多个步骤或配置选项。
具体内容
生成器模式的主要目的是将对象的构建步骤解耦,使得您可以灵活地创建不同表示的对象,同时保持构建过程的清晰性和可维护性。它通常包含以下几个关键角色:
- 产品(Product): 要创建的复杂对象,该对象通常由多个部分组成。在生成器模式中,可以有多种表示形式的产品。
- 生成器(Builder): 定义了创建产品的接口和步骤,以及设置产品各个部分的方法。生成器抽象类或接口可能包含多个构建方法,每个方法负责构建产品的一个特定部分。
- 具体生成器(Concrete Builder): 实现生成器接口,负责实际构建产品的步骤和逻辑。具体生成器将产品的构建细节封装在内部,并实现了生成器中定义的构建方法。
- 导演(Director): 可选角色,负责指导具体生成器构建产品的步骤顺序。导演可以知道构建过程的顺序,然后委托具体生成器执行构建步骤以创建最终的产品。
类结构图
适用场景
作为一种创建型的设计模式,以下情况你可以考虑使用它:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
实现
// 1. 产品(Product)
class Product {
constructor() {
this.parts = [];
}
addPart(part) {
this.parts.push(part);
}
show() {
console.log("Product Parts: ", this.parts.join(", "));
}
}
// 2. 生成器接口(Builder)
class Builder {
constructor() {
this.product = new Product();
}
buildPartA() {}
buildPartB() {}
buildPartC() {}
getResult() {
return this.product;
}
}
// 3. 具体生成器(Concrete Builder)
class ConcreteBuilder extends Builder {
buildPartA() {
this.product.addPart("PartA");
}
buildPartB() {
this.product.addPart("PartB");
}
buildPartC() {
this.product.addPart("PartC");
}
}
// 4. 导演(Director)
class Director {
constructor(builder) {
this.builder = builder;
}
construct() {
this.builder.buildPartA();
this.builder.buildPartB();
this.builder.buildPartC();
}
}
// 客户端代码
const concreteBuilder = new ConcreteBuilder();
const director = new Director(concreteBuilder);
const product = concreteBuilder.getResult();
product.show(); // Product Parts: PartA, PartB, PartC