设计模式 建造者模式

本文将介绍设计模式中的建造者模式。

一、什么是建造者模式?

二、实现

1. 结构

2. 角色

  • Builder 抽象建造者:
    • 所有具体建造者的抽象类
    • 定义了一系列方法,其中主要可分为两类:
      • buildPartX():用于创建复杂对象的各个部件
      • getResult():用于返回复杂对象
  • ConcreteBuilder 具体建造者:
    • 抽象建造者的子类
  • Product 产品:
    • 创建目标
    • 包含多个部件
  • Director 指挥者:
    • 与客户端直接交互
    • 负责安排复杂对象的建造过程

3. 简单示例

Builder:

1
2
3
4
5
6
interface Builder {
public void buildPartA();
public void buildPartB();
public void buildPartC();
public Product getResult();
}

ConcreteBuilder:

1
2
3
public class ConcreteFactory implements Factory {
···
}

Product:

1
2
3
4
5
public class Product {
private PartA partA;
private PartB partB;
private PartC partC;
}

Director:

1
2
3
4
5
6
7
8
public class Director {
private Builder builder;

public Product construct() {
...
return builder.getResult();
}
}

使用:

1
2
3
4
5
6
7
8
Builder builder;

// 通过依赖注入、反射、手动等方式实例化具体建造者
···

Director director = new Director(builder);

Product product = director.construct();

三、优缺点

1. 优点

  • 客户端无需知道复杂产品的具体创建过程,产品的获取与产品的创建过程解耦
  • 可以更加精细地控制复杂产品地创建过程

2. 缺点

  • 如果产品之间差异较大,则不适合使用建造者模式
  • 如果产品的内部变化复杂,则建造者可能较为复杂,从而增大系统的理解难度和维护成本

四、变种

1. 省略 Director

为了简化系统结构,可以将 Director 与 Builder 合并,在 Builder 中提供用于构建复杂产品对象的方法。

1
2
3
4
5
6
7
8
9
10
11
interface Builder {
public void buildPartA();
public void buildPartB();
public void buildPartC();
public Product getResult();

public Product construct() {
...
return this.getResult();
}
}

2. 引入钩子方法

为了更精确地控制复杂产品对象的创建,可以引入 isXXX() 方法,返回附件的构建与否信息,以便指挥者根据实际情况创建产品。

参考

  • 《Java 设计模式》