引入

在之前的文章中我们介绍了常见的设计模式,今天我们来使用 Java 语言对建造者模式进行具体实现举例。

实例

在下面的例子中,我们使用建造者模式来对 Person 类的实例化进行了改装,使其能够以链式调用的形式创建对象。

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
* 建造者模式
*
* 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
* 源自 https://zhuanlan.zhihu.com/p/58093669
*
* @author marx
* @date 2022/01/13
*/
public class Builder {
public static void main(String[] args) {
Person person1 = new Person("张三", 18, "男", null);
Person person2 = Person.builder()
.name("李四")
.age(18)
.gender("男")
.build();
}
}

class Person {
private String name; // 必选
private int age; // 必选
private String gender; // 必选
private String address; // 可选

public Person(String name, int age, String gender, String address) {
this.name = name;
this.age = age;
this.gender = gender;
this.address = address;
}


/**
* 建造者模式使用的开始
* 此处方法置为 static 是方便直接用类名调用
*
* @return {@link PersonBuilder}
*/
public static PersonBuilder builder() {
return new PersonBuilder();
}

static class PersonBuilder {
private String name;
private int age;
private String gender;
private String address;

// 分别用对应的属性名作为方法名来设置属性
// 方法返回 this 是为了可以实现链式调用
public PersonBuilder name(String name) {
this.name = name;
return this;
}
public PersonBuilder age(int age) {
this.age = age;
return this;
}
public PersonBuilder gender(String gender) {
this.gender = gender;
return this;
}
public PersonBuilder address(String address) {
this.address = address;
return this;
}


/**
* 建造者模式使用的结尾,将中途获取的属性都注入对象中
*
* @return {@link Person}
*/
public Person build() {
return new Person(name, age, gender, address);
}
}
}