早在2007年,我读了一篇关于Joshua Blochs的文章,介绍“构建器模式”,以及如何对其进行修改以改善对构造函数和setter的过度使用,尤其是当对象具有大量属性(其中大多数是可选属性)时。这种设计模式的简要总结articled 这里。
我喜欢这个主意,从那以后一直在使用。它的问题,尽管从客户的角度来看非常干净而且易于使用,但是实现它可能是一件痛苦的事!对象中有许多不同的地方引用了单个属性,因此创建对象和添加新属性要花费大量时间。
所以...我有个主意。首先,使用约书亚布洛赫(Joshua Bloch)风格的示例对象:
Josh Bloch风格:
public class OptionsJoshBlochStyle {
private final String option1;
private final int option2;
// ...other options here <<<<
public String getOption1() {
return option1;
}
public int getOption2() {
return option2;
}
public static class Builder {
private String option1;
private int option2;
// other options here <<<<<
public Builder option1(String option1) {
this.option1 = option1;
return this;
}
public Builder option2(int option2) {
this.option2 = option2;
return this;
}
public OptionsJoshBlochStyle build() {
return new OptionsJoshBlochStyle(this);
}
}
private OptionsJoshBlochStyle(Builder builder) {
this.option1 = builder.option1;
this.option2 = builder.option2;
// other options here <<<<<<
}
public static void main(String[] args) {
OptionsJoshBlochStyle optionsVariation1 = new OptionsJoshBlochStyle.Builder().option1("firefox").option2(1).build();
OptionsJoshBlochStyle optionsVariation2 = new OptionsJoshBlochStyle.Builder().option1("chrome").option2(2).build();
}
}
现在,我的“改进”版本:
public class Options {
// note that these are not final
private String option1;
private int option2;
// ...other options here
public String getOption1() {
return option1;
}
public int getOption2() {
return option2;
}
public static class Builder {
private final Options options = new Options();
public Builder option1(String option1) {
this.options.option1 = option1;
return this;
}
public Builder option2(int option2) {
this.options.option2 = option2;
return this;
}
public Options build() {
return options;
}
}
private Options() {
}
public static void main(String[] args) {
Options optionsVariation1 = new Options.Builder().option1("firefox").option2(1).build();
Options optionsVariation2 = new Options.Builder().option1("chrome").option2(2).build();
}
}
正如您在我的“改进版本”中所看到的,我们需要在少两个地方添加有关任何附加属性(在这种情况下为选项)的代码!我能看到的唯一的缺点是外部类的实例变量不能为最终变量。但是,没有这个类,该类仍然是不可变的。
可维护性的提高真的有不利之处吗?一定是因为他重复了我没有看到的嵌套类中的属性?