建造者模式(Builder Pattern)
建造者模式(Builder Pattern)
建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过分步骤构建对象,允许用户通过指定对象的类型和内容来创建复杂的对象,而无需了解其内部的具体构建细节。
模式结构
- 产品(Product)
表示被构建的复杂对象,通常由多个部分组成。 - 抽象建造者(Builder)
定义创建产品各个部件的抽象接口。 - 具体建造者(Concrete Builder)
实现抽象建造者的接口,完成产品各个部件的具体构建。 - 指挥者(Director)
负责调用建造者的接口,按照一定的顺序构建产品。
代码示例
1. 产品(Product)
// 产品类:由多个部件组成
class Product {
private List<String> parts = new ArrayList<>();
// 添加部件
public void add(String part) {
parts.add(part);
}
// 展示产品
public void show() {
System.out.println("产品 创建------");
for (String part : parts) {
System.out.println(part);
}
}
}
2. 抽象建造者(Builder)
// 抽象建造者:定义创建产品各个部件的接口
interface Builder {
void buildPartA(); // 创建部件A
void buildPartB(); // 创建部件B
Product getResult(); // 返回构建的产品
}
3. 具体建造者(Concrete Builder)
// 具体建造者1:实现抽象建造者接口
class ConcreteBuilder1 implements Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
// 具体建造者2:实现抽象建造者接口
class ConcreteBuilder2 implements Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
4. 指挥者(Director)
// 指挥者:负责调用建造者的接口,按照一定的顺序构建产品
class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
5.调用示例
public class BuilderPattern {
public static void main(String[] args) {
// 创建指挥者
Director director = new Director();
// 使用具体建造者1构建产品
Builder builder1 = new ConcreteBuilder1();
director.construct(builder1);
Product product1 = builder1.getResult();
product1.show();
// 使用具体建造者2构建产品
Builder builder2 = new ConcreteBuilder2();
director.construct(builder2);
Product product2 = builder2.getResult();
product2.show();
}
}
输出结果
产品 创建------
部件A
部件B
产品 创建------
部件X
部件Y
使用场景
- 复杂对象的构建
当需要构建一个复杂的对象,且该对象的构建过程涉及多个步骤时,可以使用建造者模式。 - 避免重复构造函数
当一个类的构造函数存在多个可选参数时,使用建造者模式可以避免构造函数的重复和复杂性。 - 构建过程与表示分离
当需要将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示时,可以使用建造者模式。
在Java中的应用
java.lang.StringBuilder
和java.lang.StringBuffer
这两个类都使用了建造者模式,通过append()
方法逐步构建字符串。java.nio.ByteBuffer
ByteBuffer
类通过put()
方法逐步构建字节缓冲区。
优缺点
优点
- 构建过程与表示分离
建造者模式将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 - 分步骤构建对象
建造者模式允许分步骤构建对象,用户可以控制对象的构建过程。 - 代码复用
建造者模式可以复用相同的构建代码来创建不同的对象。
缺点
- 复杂性增加
使用建造者模式需要创建多个类,增加了代码的复杂性。 - 适用范围有限
建造者模式适用于构建复杂对象,对于简单对象的构建可能会显得过于繁琐。
总结
建造者模式通过将复杂对象的构建过程与其表示分离,提供了一种灵活的方式来创建对象。它适用于需要分步骤构建复杂对象的场景,尤其是在构建过程涉及多个步骤或需要支持多种表示时。尽管它可能会增加代码的复杂性,但其优点在于提高了代码的可维护性和灵活性。在Java中,建造者模式广泛应用于字符串构建和字节缓冲区构建等场景。