0%

设计模式之Builder模式

当我们在创建对象的时候,如果对象需要很多的参数,并且有些参数是可选的,有些是必选的,有的可能默认值,这个时候如果我们用构造器传参或者通过set方法进行属性值设置,那么这样就有很大的问题,比如别人在创建这个对象的时候,并不知道需要传哪些参数,哪些参数是必须传值的,而且调用也不方便,所有我们就可以用到Builder模式,这里就是所谓的链式调用。在Effective Java书中, 第2条就是遇到到多个构造器时要考虑用构造器,里面讲的比较详细。

比如我们想这样创建一个对象

1
2
3
4
5
new User.Builder("Walker", "Han")
.age(20)
.phone("123456789")
.address("166号")
.build();

此时我们需要在User类中创建一个内部类Builder,该类用来创建User对象,通过上面的代码我们发现,可以连续调用属性的方法进行传参,这就要求每次调用后都要返回当前对象,这样才能连续调用,下面是代码:

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
/**
* 链式调用
* @author mingshan
*
*/
public class User {
private final String firstName; // 必传参数
private final String lastName; // 必传参数
private int age; // 可选参数
private String phone; // 可选参数
private String address; // 可选参数

private User(Builder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}

@Override
public String toString() {
return "User [firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", phone=" + phone
+ ", address=" + address + "]";
}

public static class Builder {
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;

public Builder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

public Builder age(int age) {
this.age = age;
return this;
}

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

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

public User build() {
return new User(this);
}
}
}

然后就可以像上面的方式进行调用了。

向本文提出修改或勘误建议