浅谈设计模式-Builder模式

当我们去设计一个比较简单的类的构造方式时,一般情况下,直接重载几个不同参数的构造方法即可。但当类的成员变量比较多的时候,可能某些成员变量是必要的,某些又是可选的。有些是创建的时候需要传入的,有些又是对象创建完成之后才传的。这样的话重载构造方法的方式就会让人感到很迷茫,必须写一大堆注释来进行说明。这个时候,用Builder模式来进行对象的构建是十分合理的。

Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
下面是标准Builder模式的类图。
Builder模式
我们在实际使用中往往使用的是改造过的Builder模式,经常会省略掉Director,直接在代码中使用Builder模式来创建对象,在这里我们自己充当了Director的角色。下面自己来实现一个最简单的Builder模式。

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
public class Person {
private String id;
private String name;
private String sex;
private int age;
private String phoneNumber;
private String email;
private String address;
private String occupation;
private Person(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.sex = builder.sex;
this.age = builder.age;
this.phoneNumber = builder.phoneNumber;
this.email = builder.email;
this.address = builder.address;
this.occupation = builder.occupation;
}
static class Builder {
private String id;
private String name;
private String sex;
private int age;
private String phoneNumber;
private String email;
private String address;
private String occupation;
public Builder(String id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public Builder setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
return this;
}
public Builder setEmail(String email) {
this.email = email;
return this;
}
public Builder setAddress(String address) {
this.address = address;
return this;
}
public Builder setOccupation(String occupation) {
this.occupation = occupation;
return this;
}
public Person build() {
return new Person(this);
}
}
}
1
2
3
4
5
6
7
8
9
10
public class TestBuilder {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person person = new Person.Builder("xxx", "Faker", "man", 22)
.setAddress("Korea").setEmail("xxx@gmail.com")
.setOccupation("lol").setPhoneNumber("12345678901").build();
}
}

上面的例子很直观的反映出了Builder模式的核心内容,当我们想要创建Person对象时,哪些参数是必须的,哪些是可选的,一目了然。而且链式的调用方式可读性更佳。
在Android中最常见的Builder模式就是AlertDialog了吧,在平时的编码中经常打交道。还有开源框架okhttp也大量使用了Builder模式,相信用过的人肯定深有感触。

文章目录
|