[Design Pattern] is a solution to a problem in a context.
建造者模式 (Builder pattern)
什么是建造者模式?: 是一种对象构建模式, 它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.
为什么要用建造者模式?: 首先Builder Pattern是一个创建型模式, 它可以用于将一个复杂对象的构建与它的表示分离, 这样做的好处是可以使得创建复杂对象的过程更加灵活和可控, 使代码更加可读、可维护,也更容易扩展.
让我们先来看个问题,然后尝试使用建造者模式来解决。
问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Person {
private final String firstName;
private final String lastName;
private final String email;
private final String nickname;
public Person(
String firstName,
String lastName,
String email,
String nickname
) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.nickname = nickname;
}
}
那么我们如何实例化上边的Class呢?
1
2
3
4
5
6
Person pObj = new Person(
'Peter',
'Dong',
'peter@example.com',
'pdong'
);
我们发现创建实例化的过程构造函数需要传入多个参数, 如果随着对象的属性的增多可能使之后的维护人员更难理解, 可读性非常差, 另外如果一个属性是可选的话上述方法还是需要传入值的.
解决方案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class PersonBuilder {
private String firstName;
private String lastName;
private String email;
private String nickname;
public PersonBuilder setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public PersonBuilder setLastName(String lastName) {
this.lastName = lastName;
return this;
}
// ...
public Person build() {
return new Person(
this.firstName, this.lastName, this.email, this.nickname
);
}
}
实例化:
1
2
3
4
5
6
Person myPerson = new PersonBuilder()
.setFirstName('Peter')
.setLastName('Dong')
.setEmail('peter@example.com')
.setNickName('pdong')
.build();