首页 > 代码库 > 设计模式——建造者模式(Builder)
设计模式——建造者模式(Builder)
建造者模式(Builder)
什么是建造者模式?大部分网上的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;是看完之后是不是一头雾水啊,我们可以和工厂模式进行比较一下,前面我们已经了解过了工厂模式,它是创建单个类的模式,而建筑者模式则是让各种产品集中管理,用来创建复合对象。复合对象就是指某个类具有不同的属性;
下面我们用一个例子进行讲解,比如一个User类,我们需要构建一大批用户,用户属性:username,password,mail,age,sex;
package cs_factory;
public class User {
private String username;
private String password;
private String mail;
private int age;
private String sex;
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
不同用户注册的时候可能全都填写了,而有一些就填了昵称和密码
所有需要构造方法了:
public User(String username, String password, String mail, int age, String sex) {
super();
this.username = username;
this.password = password;
this.mail = mail;
this.age = age;
this.sex = sex;
}
public User(String username, String password){
super();
this.username = username;
this.password = password;
}
其他不一一写了,方法大家都懂
而测试类就该这样,你就可以这样创建各个需要的对象
User user1 = new User("一只猫","123","123@qq.com",16,"女");
User user2 = new User("一条鱼","123",20,"男");
User user3 = new User("一只狗","123","456@qq.com");
User user4 = new User("一个人","123");
我们可以观察一下这样写是不是可读性很差,鬼知道里面的123是什么,16是什么。如果这样不明显,那么你再加两个属性:身高,体重;是不是更看不懂了。
private double height;
private double weight;
我们再想想看,就是当有很多参数时,编写这个构造函数就会显得异常麻烦,这时候如果换一个角度,试试Builder模式,你会发现代码的可读性一下子就上去了。我们这样干,把User的构造方法都不要,在里面这样写:
...
private User(Builder builder) {
this.username=builder.username;
this.password=builder.password;
this.mail=builder.mail;
this.age=builder.age;
this.sex=builder.sex;
}
static class Builder{
private String username;
private String password;
private String mail;
private int age;
private String sex;
public Builder username(String username){
this.username=username;
return this;
}
public Builder password(String password){
this.password=password;
return this;
}
public Builder mail(String mail){
this.mail=mail;
return this;
}
public Builder age(int age){
this.age=age;
return this;
}
public Builder sex(String sex){
this.sex=sex;
return this;
}
public User build(){
return new User(this);
}
}
...
那么我们就可以这样构造了:
User.Builder builder = new User.Builder();
User user = builder
.username("一只猫")
.password("123")
.mail("123@qq.com")
.age(18)
.sex("女")
.build();
四个字形容:“简单明了” 三个字形容:“真清楚” 两字:“漂亮” 一字:“酷”。
我就问你们是不是都知道我要填的什么属性。在Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强。其实在java中有两个常见的类也是Builder模式,那就是StringBuilder和StringBuffer。
还有其他的各大框架中广泛应用建造者模式,比如网络请求的okhttp等等。
最后说下我们是怎么干成这样的:
1.首先要一个静态的内部类Builder,而且成员和外部类User一毛一样。
2.Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
3.Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder。
4.外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值
设计模式——建造者模式(Builder)