一、前言
Builder 模式也称为构建者模式,平时用得非常多。
二、代码实现
Builder 模式比较简单,直接上示例代码:
public class User {
private final String name; //必选
private final String cardID; //必选
private final int age; //可选
private final String address; //可选
private final String phone; //可选
private User(UserBuilder userBuilder){
this.name=userBuilder.name;
this.cardID=userBuilder.cardID;
this.age=userBuilder.age;
this.address=userBuilder.address;
this.phone=userBuilder.phone;
}
public String getName() {
return name;
}
public String getCardID() {
return cardID;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}
public String getPhone() {
return phone;
}
public static class UserBuilder{
private final String name;
private final String cardID;
private int age;
private String address;
private String phone;
public UserBuilder(String name,String cardID){
this.name=name;
this.cardID=cardID;
}
public UserBuilder age(int age){
this.age=age;
return this;
}
public UserBuilder address(String address){
this.address=address;
return this;
}
public UserBuilder phone(String phone){
this.phone=phone;
return this;
}
public User build(){
return new User(this);
}
}
}
需要注意的点:
1、User 类的构造方法是私有的,调用者不能直接创建User对象。
2、User 类的属性都是不可变的。所有的属性都添加了 final 修饰符,并且在构造方法中设置了值。并且,对外只提供getters 方法。
3、Builder 的内部类构造方法中只接收必传的参数,并且该必传的参数使用了 final 修饰符。
三、调用方式
new User.UserBuilder("Jack","10086")
.age(25)
.address("GuangZhou")
.phone("13800138000")
.build();
相比起前面通过构造函数和 setter/getter 方法两种方式,可读性更强。唯一可能存在的问题就是会产生多余的 Builder 对象,消耗内存。然而大多数情况下我们的 Builder 内部类使用的是静态修饰的 (static),所以这个问题也没多大关系。