一、什么是建造者模式
建造者模式是一种用于逐步构建复杂对象的创建型设计模式。它允许您使用相同的构建过程生成不同类型和表示的对象。当对象需要用大量可选组件或配置进行构建时,该模式尤为有用。
二、简单示例
<template>
<div>
<p>{{ product.part_a }}</p>
<p>{{ product.part_b }}</p>
<p>{{ product.part_c }}</p>
</div>
</template>
<script>
// 产品类:正在构建的对象
class Product {
constructor() {
this.part_a = null;
this.part_b = null;
this.part_c = null;
}
}
// 建造者接口:指定构建产品的步骤
class Builder {
buildPartA() {}
buildPartB() {}
buildPartC() {}
getResult() {}
}
// 具体建造者:实现建造者接口以构建产品
class ConcreteBuilder extends Builder {
constructor() {
super();
this.product = new Product();
}
buildPartA() {
this.product.part_a = "零件A";
}
buildPartB() {
this.product.part_b = "零件B";
}
buildPartC() {
this.product.part_c = "零件C";
}
getResult() {
return this.product;
}
}
// 指挥者:使用建造者管理构建过程
class Director {
constructor(builder) {
this.builder = builder;
}
construct() {
this.builder.buildPartA();
this.builder.buildPartB();
this.builder.buildPartC();
}
}
export default {
data() {
return {
product: null,
};
},
mounted() {
const builder = new ConcreteBuilder();
const director = new Director(builder);
director.construct();
this.product = builder.getResult();
},
};
</script>
//示例中,`Product`是正在构建的对象,`Builder`是构建产品的接口,
//`ConcreteBuilder`是`Builder`接口的实现,`Director`管理构建过程。
//客户端代码创建了一个`ConcreteBuilder`,将其传递给`Director`,
//然后启动构建过程。最终,获取构建的产品并在Vue组件中使用。
通俗的讲: 建造者模式的关键是分步构建复杂对象,使得同样的构建过程可以创建不同的表示。客户端可以根据需要选择使用不同的具体建造者。
建造者模式的主要目的是将一个复杂对象的构建过程和其表示分离,使得同样的构建过程可以创建不同的表示。这有助于更灵活地构建不同类型的对象,而不必改变构建过程的代码。
在我的前一个例子中,Director负责管理构建过程,但客户端可以选择使用不同的具体建造者。这种方式允许客户端根据需要构建不同类型的产品,而不是一次性构建所有可能的产品。
所以,建造者模式的主要思想是允许客户端有选择地构建产品的一部分,而不是一次性构建整个产品。这样的设计有助于更好地应对复杂对象的创建需求。
通常的使用场景
- 创建复杂对象: 当需要创建的对象具有复杂的内部结构,包含多个部分或步骤,且这些部分之间的组合方式可以灵活变化时,可以使用建造者模式。
- 同一构建过程,不同表示: 如果存在多个表示或配置,但构建过程相同,可以使用建造者模式。这样,可以使用不同的建造者来构建具有相同步骤的不同表示的对象。
- 避免构造者过于庞大: 当一个类的构造函数参数过多,或者存在多个构造函数,为了避免构造函数的参数列表过于庞大,可以使用建造者模式,将构造函数的参数拆分到不同的方法中。
- 创建不可变对象: 如果希望创建的对象是不可变的,即一旦创建就不能修改其内部状态,建造者模式可以通过在构建过程中逐步构建不可变对象来实现。
- 更好的封装性: 建造者模式提供了更好的封装性,客户端代码只需关心指挥者和建造者,而不需要知道具体产品的构建细节。