定义
将一个复杂对象的构建与它的表示分离,使得同样的创建过程可以有不同的表示方式,用户只需要建造具体的类型就可以,而无需知道建造的具体细节。例如现在有个类有A、B、C三个属性。这个对象的构造顺序可以是A->B->C,或者是B->A->C等等
优点
- 封装性好,创建和使用分离
- 扩展性好,解耦
缺点
- 类中会多于出Builder类
- 建造的产品内部更改,建造者也需要更改,成本较大
代码实现
本小节不实现建造者模式,我们用lombok的@builder来进行说明。如果不会使用lombok,请自行google或者百度。
@Builder
public class User {
private Long id;
private String username;
private String password;
private Integer age;
private Character gender;
private String hobby;
}
User类的结构如上所示,我们看下lombok为我们生产的建造者模式的代码如何。如下面所示,lombok生产了UserBuilder的内部类,我们可以根据具体的字段类型来建造User这个类的对象。
public class User {
private Long id;
private String username;
private String password;
private Integer age;
private Character gender;
private String hobby;
User(Long id, String username, String password, Integer age, Character gender, String hobby) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.gender = gender;
this.hobby = hobby;
}
public static User.UserBuilder builder() {
return new User.UserBuilder();
}
public String toString() {
return "User(id=" + this.id + ", username=" + this.username + ", password=" + this.password + ", age=" + this.age + ", gender=" + this.gender + ", hobby=" + this.hobby + ")";
}
public static class UserBuilder {
private Long id;
private String username;
private String password;
private Integer age;
private Character gender;
private String hobby;
UserBuilder() {
}
public User.UserBuilder id(Long id) {
this.id = id;
return this;
}
public User.UserBuilder username(String username) {
this.username = username;
return this;
}
public User.UserBuilder password(String password) {
this.password = password;
return this;
}
public User.UserBuilder age(Integer age) {
this.age = age;
return this;
}
public User.UserBuilder gender(Character gender) {
this.gender = gender;
return this;
}
public User.UserBuilder hobby(String hobby) {
this.hobby = hobby;
return this;
}
public User build() {
return new User(this.id, this.username, this.password, this.age, this.gender, this.hobby);
}
public String toString() {
return "User.UserBuilder(id=" + this.id + ", username=" + this.username + ", password=" + this.password + ", age=" + this.age + ", gender=" + this.gender + ", hobby=" + this.hobby + ")";
}
}
}
下面我们使用Main方法来测试下
public class BuilderMain {
public static void main(String[] args) {
User user = User.builder().id(1L).username("admin").password("123456").build();
System.out.println(user);
//User(id=1, username=admin, password=123456, age=null, gender=null, hobby=null)
}
}