建造者模式(Builder Pattern)

建造者模式(Builder Pattern)

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过分步骤构建对象,允许用户通过指定对象的类型和内容来创建复杂的对象,而无需了解其内部的具体构建细节。

模式结构

  1. 产品(Product)
    表示被构建的复杂对象,通常由多个部分组成。
  2. 抽象建造者(Builder)
    定义创建产品各个部件的抽象接口。
  3. 具体建造者(Concrete Builder)
    实现抽象建造者的接口,完成产品各个部件的具体构建。
  4. 指挥者(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

使用场景

  1. 复杂对象的构建
    当需要构建一个复杂的对象,且该对象的构建过程涉及多个步骤时,可以使用建造者模式。
  2. 避免重复构造函数
    当一个类的构造函数存在多个可选参数时,使用建造者模式可以避免构造函数的重复和复杂性。
  3. 构建过程与表示分离
    当需要将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示时,可以使用建造者模式。

在Java中的应用

  • java.lang.StringBuilderjava.lang.StringBuffer
    这两个类都使用了建造者模式,通过 append() 方法逐步构建字符串。
  • java.nio.ByteBuffer
    ByteBuffer 类通过 put() 方法逐步构建字节缓冲区。

优缺点

优点

  1. 构建过程与表示分离
    建造者模式将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  2. 分步骤构建对象
    建造者模式允许分步骤构建对象,用户可以控制对象的构建过程。
  3. 代码复用
    建造者模式可以复用相同的构建代码来创建不同的对象。

缺点

  1. 复杂性增加
    使用建造者模式需要创建多个类,增加了代码的复杂性。
  2. 适用范围有限
    建造者模式适用于构建复杂对象,对于简单对象的构建可能会显得过于繁琐。

总结

建造者模式通过将复杂对象的构建过程与其表示分离,提供了一种灵活的方式来创建对象。它适用于需要分步骤构建复杂对象的场景,尤其是在构建过程涉及多个步骤或需要支持多种表示时。尽管它可能会增加代码的复杂性,但其优点在于提高了代码的可维护性和灵活性。在Java中,建造者模式广泛应用于字符串构建和字节缓冲区构建等场景。