设计模式之建造者模式

使用场景

  • 对象的构建有很多必填参数,如果使用构造函数会导致参数列表过长难以使用
  • 构造参数之间有依赖关系,比如设置了 minAge 就必须设置 maxAge,且 minAge 小于等于 maxAge
  • 类的属性一旦被创建就不可变(不暴力 set()方法)

类图

Person 类包含了一个内部类 Builder,负责对外暴露设置属性的方法,这些方法可以包含校验和初始化规则,属性之前的依赖规则可以放到最终调用的 build()方法中校验

代码实现

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
46
47
48
49
50
51
52
public class Person {

private Long id;
private String name;
private Integer minAge;
private Integer maxAge;

private Person() {
}

public static class Builder {

private Person person = new Person();

public Builder id(Long id) {
person.id = id;
return this;
}

public Builder name(String name) {
person.name = name;
return this;
}

public Builder minAge(Integer minAge) {
person.minAge = minAge;
return this;
}

public Builder maxAge(Integer maxAge) {
person.maxAge = maxAge;
return this;
}

public Person build() {
if (person.minAge != null && person.maxAge != null) {
if (person.minAge < 0) {
throw new IllegalArgumentException("minAge必须大于等于0");
}
if (person.maxAge <= person.minAge) {
throw new IllegalArgumentException("maxAge必须大于等于minAge");
}
} else if ((person.minAge == null && person.maxAge != null) ||
(person.minAge != null && person.maxAge == null)) {
throw new IllegalArgumentException("minAge和maxAge必须同时设置");
}
return person;
}

}

}

与工厂模式有何区别?

  • 工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
  • 建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。