定义 :将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
场景 :
- 相同的方法,不同的执行顺序,产生不同的事件结果时.
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时.
- 产品类非常复杂,或者产品类的调用顺序不同产生了不同的作用,
- 当初始化一个对象非常复杂,如参数多,且很多参数都有默认值.
public class User {
private final String firstName; // 必传参数
private final String lastName; // 必传参数
private final int age; // 可选参数
private final String phone; // 可选参数
private final String address; // 可选参数
private User(UserBuilder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
public static class UserBuilder {
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;
public UserBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public UserBuilder address(String address) {
this.address = address;
return this;
}
public User build() {
return new User(this);
}
}
}
有几个重要的地方需要强调一下:
- ****User****类的构造方法是私有的。也就是说调用者不能直接创建User对象。
- ****User****类的属性都是不可变的。所有的属性都添加了final修饰符,并且在构造方法中设置了值。并且,对外只提供getters方法。
- Builder模式使用了链式调用。可读性更佳。
- Builder的内部类构造方法中只接收必传的参数,并且该必传的参数适用了final修饰符。