构造者(Builder)模式
构造者(Builder)模式
Builder模式是为了弥补Java语言设计上的不足,话不多说,下面我们一起来看个栗子就知道啦!
public class User{
String name;
int age;
String email;
String address;
public User(){
}
//想要有名字和邮箱的构造器
public User(String name, String email){
this.name = name;
this.email = email;
}
//想要有名字和地址的构造器
public User(String name, String address){
this.name = name;
this.address = address;
}
}
在上面代码中,很容易可以发现,在我们正常的需求下,Java构造器的编写将会出问题,由于参数个数和类型一样无法构成重载,所以这样写是不行的,那么Builder模式就是为了解决这种情况而出现的。
Builder模式的实现
下面我们一起来看一下Builder模式如何编写的
public class User {
String name;
int age;
String phone;
String email;
String address;
//注意无参构造器私有,避免外界使用构造器创建User对象
private User() {
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", phone=" + phone + ",
email=" + email + ", address=" + address
+ "]";
}
public static class Builder {
private String name;
private int age;
private String phone;
private String email;
private String address;
public Builder() {
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setAge(int age) {
this.age = age;
return this;
}
public Builder setPhone(String phone) {
this.phone = phone;
return this;
}
public Builder setEmail(String email) {
this.email = email;
return this;
}
public Builder setAddress(String address) {
this.address = address;
return this;
}
public User build() {
User user = new User();
user.name = name;
user.age = age;
user.email = email;
user.phone = phone;
user.address = address;
return user;
}
}
}
根据上面的代码,我们可以看出来,就是在User内部创建一个内部类,并且拥有和User一样的字段(属性),并且提供SET方法,最重要的是要提供一个能够返回User对象的方法(build),这样才能通过Builder来创建User对象。
Builder设计模式还有一个好处,那便是我们可以随意组合输入的参数,不仅避免了重载出错的问题,还不需要写过多的构造器。
下面我们一起看看写完Builder模式类之后如何来调用:
public class UserTest {
public static void main(String[] args) {
User u = new User.Builder().setName("bob").setAge(22).build();
System.out.println(u);
}
}