设计模式-建造者模式(Builder)

128 阅读1分钟

建造者模式(Builder)

Builder:建造者模式是一种创建型设计模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

/**
 * 建造者模式
 *
 * @author CAI
 * @time 2020/11/5
 */
public class BuilderPattern {
​
    public static void main(String[] args) {
        Director director = new Director();
        Builder builder1 = new ConcreteBuilder1();
        Builder builder2 = new ConcreteBuilder2();
​
        director.construct(builder1);
        Product product1 = builder1.getResult();
        product1.show();
​
        director.construct(builder2);
        Product product2 = builder2.getResult();
        product2.show();
    }
}
​
/**
 * 产品类:由多个部件组成
 */
class Product {
    List<String> parts = new ArrayList<>();
​
    /**
     * 添加部件
     *
     * @param part 产品部件
     */
    public void add(String part) { // 添加部件
        parts.add(part);
    }
​
    /**
     * 列举所有的部件
     */
    public void show() {
        System.out.println("产品 创建------");
​
        for (String part: parts) {
            System.out.println(part);
        }
    }
}
​
/**
 * 建造者接口:产品有两部组成,并有一个返回方法
 */
interface Builder {
​
    /**
     * 创建 A 部分
     */
    void buildPartA();
​
    /**
     * 创建 B 部分
     */
    void buildPartB();
​
    /**
     * 获得产品
     *
     * @return 具体产品
     */
    Product getResult();
}
​
/**
 * 具体建造者
 */
class ConcreteBuilder1 implements Builder {
​
    private final Product product = new Product();
​
    @Override
    public void buildPartA() {
        product.add("部件A");
    }
​
    @Override
    public void buildPartB() {
        product.add("部件B");
    }
​
    @Override
    public Product getResult() {
        return product;
    }
}
​
/**
 * 具体创建者
 */
class ConcreteBuilder2 implements Builder {
    private final Product product = new Product();
​
    @Override
    public void buildPartA() {
        product.add("部件X");
    }
​
    @Override
    public void buildPartB() {
        product.add("部件Y");
    }
​
    @Override
    public Product getResult() {
        return product;
    }
}
​
/**
 * 指挥者类:指挥建造的过程
 */
class Director {
​
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}
  1. Builder:声明所有类型的构造器中通用的产品构造步骤。
  2. ConcreteBuilder:提供构造过程的不同实现,具体的Builder也可以构造不遵循通用接口的产品。
  3. Product:最终生成的对象;由不同Builder构造的产品无需属于同一类层次结构或接口。
  4. Director:定义调用构造步骤的顺序。
  5. 使用者必须将某个BuilderDirector关联。一般通过Director的构造函数的参数进行一次性关联即可,此后Director就能使用Builder完成后续所有的构造任务。但在客户端将Builder对象传给Director时还有另外一种方式,即:每次使用Director时可以使用不同的Builder

使用场景

  1. 使用Builder模式可以避免重复构造函数的出现。

    • 若一个类的构造函数存在多个可选参数,创建该对象时会非常不方便;可以考虑提供可选参数比较少的构造对象,使用Builder模式将对象进行分步骤创建。
  2. 希望使用代码创建不同形式的对象时,可以使用Builder模式。

    • 当需要创建的对象仅有不同参数上的差异时,可以使用此模式;通过实现具体步骤来生成特定的对象。
  3. 当需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,可以考虑使用。

  4. 主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。

优缺点

  • 优点:

    • 使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者满足单一职责的原则。
    • 用户只需指定需要建造的类型就可以得到它们。
    • 可以分步骤创建对象,暂缓创建步骤或递归运行创建步骤。
    • 生成不同形式的产品时,可以复用相同的制造代码。
  • 缺点:

    • 使用建造者模式时需要创建多个类,代码的实现会复杂一些。

在 JAVA 中的运用

Java的核心库为例

  1. java.lang.StringBuilder: appdend()
  2. java.lang.StringBuffer: appdend()
  3. java.nio.ByteBuffer: put(),同样的还有CharBuffer, IntBuffer ...等等的put()