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

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

类型

创建类模式

结构

建造者模式结构

组成

  1. 产品类 (Product):通常为一个较为复杂的对象,该对象的过程比较复杂;
  2. 抽象建造者 (Builder):用于封装建造的过程,将具体过程交与它的子类来实现。
  3. 具体建造者 (Concrete Builder):实现抽象建造者所有未实现的方法,具体来说一般是两项任务:组建产品和返回组建好的产品。
  4. 导演类 (Director):负责调用适当的建造者来组建产品,一般不与产品类发生依赖关系。通常导演类被用来封装程序中易变的部分。

优点

  1. 易于解耦:将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品;
  2. 易于精确控制对象的创建:将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰;
  3. 易于拓展:增加新的具体建造者无需修改原有类库的代码,易于拓展,符合”开闭原则”。

缺点

  1. 建造者模式所创建的产品需要具有较多的共同点,组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

适用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式;
  2. 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,可以使用该模式;
  3. 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能, 可以使用该模式;
  4. 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。

代码实现

产品类(Product)

@Getter
@Setter
@NoArgsConstructor
public class Product {
    private int wheels;
    private String color;
}

抽象建造者(Builder)

public interface Builder {
    Product build();
    Builder setColor(final String color);
    Builder setWheels(final int wheels);
}

具体建造者(Concrete Builder)

public class ConcreteBuilder implements Builder {
    private Product product;
    public ConcreteBuilder() {
        product = new Product();
    }

    @Override
    public Product build() {
        return product;
    }

    @Override
    public Builder setColor(String color) {
        product.setColor(color);
        return this;
    }

    @Override
    public Builder setWheels(int wheels) {
        product.setWheels(wheels);
        return this;
    }
}

导演类(Director)

public class Director {
    private Builder builder;

    public Director(final Builder builder) {
        this.builder = builder;
    }

    public Product construct() {
        return builder.setWheels(4).setColor("Red").build();
    }

    public static void main(final String[] arguments) {
        final Builder builder = new ConcreteBuilder();
        final Director director = new Director(builder);
        System.out.println(director.construct());
    }
}

参考代码

https://github.com/xueyufish/design-pattern-java/tree/master/builder