您的位置:首页 > 产品设计 > UI/UE

多个构造参数考虑使用Builder构造器模式

2016-02-26 21:37 681 查看
对于有多个参数的类,我们一向习惯采用重载构造方法的模式,像这样

public class User {
private String name;
private int age;
private String address;

public User(String name) {
super();
this.name = name;
}

public User(String name, int age) {
super();
this.name = name;
this.age = age;
}

public User(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
}


当需要多个构造参数时,我们必须按照顺序依次传入,如果参数更多,那么代码会很难写,并且难以阅读,如果读者想知道哪些参数是什么意思就必须很仔细地数着来探究参数的意义,如果顺序弄反了程序就会出错.

那么在多个构造参数时我们有第二种方法,即JavaBean模式,这种模式我们采用无参构造方法创建对象,并且提供get,set方法

/** User类 */
public class User {
private String name;
private int age;
private String address;

public User(String name) {
super();
this.name = name;
}

public User(String name, int age) {
super();
this.name = name;
this.age = age;
}

public User(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}

public String getName() {
return name;
}

public User() {
super();
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public static void main(String[] args) {

}
}


这样弥补了重载多个构造方法的不足,创建实例变得更容易,并且代码也更易读.这种写法也有很严重的缺点,因为构造过程被分配到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.

第三种替代方法就是Builder模式,不直接生成想要的对象,而是在客户端利用所有必要的参数调用构造器,得到一个builder对象.然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数.最后,客户端调用无参的build方法来生成不可变的对象.

/** User类 */
public class User {
private String name;
private int age;
private String address;

public static class Builder {
// 必要参数
private String name;
// 可选参数
private int age;
private String address;

public Builder(String name) {
this.name = name;
}
//调用setter方法后必须返回对象本身,已完成后续调用
public Builder setAge(int age) {
this.age = age;
return this;
}

public Builder setAddress(String address) {
this.address = address;
return this;
}

// 调用无参方法生成示例
public User build() {
return new User(this);
}
}

public User(Builder builder) {
name = builder.name;
age = builder.age;
address = builder.address;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", address=" + address + "]";
}

public static void main(String[] args) {
User user = new User.Builder("dong").setAge(25).setAddress("shenzhen").build();
System.out.println(user.toString());
}
}


以上就完成了Builder的代码,代码十分易读.Builder模式十分灵活,可以利用单个builder构建多个对象,builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变.Android 上的AlertDialog便是采取这种写法来构建提示对话框的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: