设计模式之禅——建造者模式

引:生产一个产品,它必然有很多零部件,不同的组装顺序和零部件个数可能会导致不同的产品,通过控制这些顺序与个数可以达到快速生成不同产品的目的,就可以使用建造者模式

定义

建造者模式也叫做生成器模式。

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

通用类图如下:

builder

在建造者模式中,有如下4个角色:

  • Product产品类:通常是实现了模板方法模式,也就是有模板方法和基本方法。这个可以看之前写的模板方法模式。
  • Builder抽象建造者:规范产品的组件,一般是由子类实现。
  • ContreteBuilder具体建造者:实现抽象类定义的所有方法,并返回一个组建好的对象。
  • Director导演类:负责安排已有模块的顺序,然后告诉Builder开始建造。

我们可以看到下面的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 产品类 通常由模板方法模式实现
public class Product {

// 一个方法相当于产品的一个零件
public void doSomething() {
// 独立业务处理
}
}

// 抽象建造者
public abstract class Builder {
// 设置产品的不同部分(包括零件种类和顺序),以获得不同的产品
public abstract void setPart();
// 建造产品
public abstract Product bulidProduct();
}

// 具体建造者
public class ContreteBuilder extends Builder {
private Product product = new Product();
@Override
public void setPart() {
// 产品类内部逻辑
}

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

// 导演类,起到封装的作用,避免高层模块深入到建造者内部的实现类。
public class Director {
private Builder builder = new ContreteBuilder();

public Product getProduct() {
builder.setPart();
return builder.buildProduct();
}
}

应用

优点

  1. 封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
  2. 建造者独立,容易扩展。

使用场景

  1. 相同方法,不同执行顺序,产生不同事件结果时,可以采用建造者模式。
  2. 多个部件或零件,都可以装配到一个对象中,但是产生不同的效能,可以使用建造者模式。
  3. 产品类中的调用顺序不同产生不同的效能,可以使用建造者模式。

注意事项

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方。

最佳实践

在使用建造者模式的时候考虑一下模板方法模式,别孤立地思考一个模式,僵化得套用一个模式会让你受害无穷。

参考

  1. 《设计模式之禅》