静态工厂和构造器有个共同的局限性:他们都不能很好的扩展到大量的可选参数。
遇到多个构造器(构造方法)参数时,如何操作???
方法一 :重叠构造器模式(可读性不好)
原理:提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,依次类推,直到最后一个构造器包含所有的可选参数。
缺点:谁作为第一个可选参数是一个问题,因为后一个包含两个可选参数的构造器必须传递值给第一个可选参数,导致需要设置许多本不想设置的参数。
方法二 :JavaBeans模式(安全性不好)
原理:通过一个无参构造器创建对象,然后调用setter方法来设置每个必要的参数。这样创建实例很容易,产生的代码读起来也比较容易。
缺点:因为构造过程中被划分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来保证一致性。
简单来说就是多个字段需要调用就要执行多次setter方法进行设值,数据不能一次性完成,就可能在构造中被改变。
JavaBean模式下无法将类设置为不可变(即final类型),那么这样需要我们去确保它的线程安全。
方法三 :Builder模式(推荐)
* 不直接生成想要的对象,让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法
* 来设置每个相关的可选参数。最后,客户端调用无参的build方法来生成不可变的对象
private final String value01;
private final String value02;
private final String value03;
private final String value04;
private BuilderDemo(Builder builder) {
this.value01 = builder.value01;
this.value02 = builder.value02;
this.value03 = builder.value03;
this.value04 = builder.value04;
}
// 构建器
public static class Builder {
private String value01;
private String value02;
private String value03;
private String value04;
public Builder value01(String value01) {
this.value01 = value01;
return this;
}
public Builder value02(String value02) {
this.value02 = value02;
return this;
}
public Builder value03(String value03) {
this.value03 = value03;
return this;
}
public Builder value04(String value04) {
this.value04 = value04;
return this;
}
public BuilderDemo build() {// build方法,生成一个需要被构建的类
return new BuilderDemo(this);
}
}
public static void main(String[] args) {
BuilderDemo builderDemo = new Builder().value01("1").value02("2").value03("3").value04("4").build();
}