0%

建造者模式

建造者模式

建造者模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。

问题

假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。它一般有众多需要传入的初始化参数,一般情况下绝大多数参数都没有用,只有在少数特定情况下才会使用到它们。这使得构造方法非常的不简洁。

解决方案

使用建造者模式可以帮助解决这种问题。建造者模式将对象的构造代码从产品类当中抽取出来,放在单独的建造者对象里面。使用者根据自身需要调用所需要配置的参数即可创建特定的对象。

如果你有不同的需要你可以创建多种不同的建造者,它们方法一样但是具体实现却不同。同样的调用方法因为建造者的不同所创建出的对象也不同。比如你想组装一辆车,同样的安装轮子方法,三轮车的建造者只给车子安装三个轮子,小汽车的建造者会给车子安装四个轮子,它们最终造出来的车也不同。

同时你也可以创建一个Director(主管)类,这个类里面定义好了一些固定的对建造者操作的过程,用来直接完成一个产品的创建。比如makeCar(),用来直接创建一个小汽车。

优点

  • 你可以分步创建对象, 暂缓创建步骤或递归运行创建步骤。
  • 生成不同形式的产品时, 你可以复用相同的制造代码。
  • 单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。

缺点

  • 由于该模式需要新增多个类, 因此代码整体复杂程度会有所增加。

模式结构图

实例

完整代码地址

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
41
42
43
44
45
public class RobotBuilder implements Builder {
private String name = "";
private String color = "";
private int id = -1;
private String height = "";
private String weight = "";
private Weapon mWeapon = null;

public RobotBuilder(){
}

@Override
public void setName(String name) {
this.name = name;
}

@Override
public void setColor(String color) {
this.color = color;
}

@Override
public void setId(int id) {
this.id = id;
}

@Override
public void setHeight(String height) {
this.height = height;
}

@Override
public void setWeight(String weight) {
this.weight = weight;
}

@Override
public void setWeapon(Weapon weapon) {
this.mWeapon = weapon;
}

public Robot getRobot() {
return new Robot(this.id, name, color, height, this.weight, mWeapon);
}
}

适用场景

  • 当构造方法入参过多时可以使用建造者模式进行优化
  • 当产品的构造经常被复用,主管类可以帮助定义好生成步骤
  • 需要分步骤构造产品

网络请求库的请求体构建,StringBuffer,StringBuilder等