前言
Builder模式是一种一步一步创建一个复杂对象的设计模式,这种设计模式的精髓就主要有两点:其一,用户使用简单,并且可以在不需要知道内部构建细节的情况下,就可以构建出复杂的对象模型;其二,对于设计者来说,这是一个解耦的过程,这种设计模式可以将构建的过程和具体的表示分离开来。
Builder模式的使用场景
- 相同的方法,不同的执行顺序,产生不同的时间结果
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不同时
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候用建造者模式非常适合
- 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值
示例
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public static Builder builder() {
return new Builder();
}
private User(Builder builder) {
this.username = builder.username;
this.password = builder.password;
}
public static class Builder {
private String username;
private String password;
public Builder setUserName(String username) {
this.username = username;
return this;
}
public Builder setPassword(String password){
this.password=password;
return this;
}
public User build() {
return new User(this);
}
@Override
public String toString() {
return "Builder{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public static void main(String[] args) {
Builder builder = new User.Builder();
builder.setUserName("lss0555")
.setPassword("12345")
.build();
//或者
User user = new User.Builder().setUserName("lss0555").setPassword("123123").build();
//或者
User user1 = User.builder().setUserName("lss0555").setPassword("654321").build();
System.out.println("builder结果:"+builder.toString());
System.out.println("User结果:"+user.toString());
System.out.println("User2结果:"+user1.toString());
}
}
结果
builder结果:Builder{username=’lss0555’, password=’12345’}
User结果:User{username=’lss0555’, password=’123123’}
User2结果:User{username=’lss0555’, password=’654321’}
总结
Builder模式与传统的模式相比,Builder模式的代码量会比正常多不少,但是随之带来的好处是代码的可读性和可维护性。但是,往往一个好的设计模式或架构,就是在牺牲某一种能力从而大大增强另一种能力,例如,牺牲一定的可读性,增加项目的可扩展性等等这样的方式。因此,在参数较为复杂,构造对象相对繁琐的情况下,可以考虑使用Builder模式。