首页 > 代码库 > 设计模式——建造者模式(Builder)

设计模式——建造者模式(Builder)

建造者模式(Builder

什么是建造者模式?大部分网上的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示是看完之后是不是一头雾水啊,我们可以和工厂模式进行比较一下,前面我们已经了解过了工厂模式,它是创建单个类的模式,而建筑者模式则是让各种产品集中管理,用来创建复合对象复合对象就是指某个类具有不同的属性

技术分享

下面我们用一个例子进行讲解,比如一个User类,我们需要构建一大批用户,用户属性:usernamepasswordmailagesex 

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模式,那就是StringBuilderStringBuffer

还有其他的各大框架中广泛应用建造者模式,比如网络请求的okhttp等等。

最后说下我们是怎么干成这样的:

1.首先要一个静态的内部类Builder而且成员和外部类User一毛一样。

2.Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this

3.Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder

4.外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值

设计模式——建造者模式(Builder)