2007 년에 Joshua Blochs가 "빌더 패턴"에 대해 다루는 기사와 특히 개체에 많은 속성이있는 경우 생성자 및 세터의 남용을 개선하기 위해 수정하는 방법에 대한 기사를 읽었습니다. 대부분은 선택 사항입니다. 이 디자인 패턴에 대한 간략한 요약이 여기에 있습니다 .
나는 그 아이디어를 좋아했고 그 이후로 그것을 사용해왔다. 그것의 문제는 클라이언트 관점에서 사용하는 것이 매우 깨끗하고 훌륭하지만 그것을 구현하는 것은 부끄러운 일이 될 수 있습니다! 객체에는 단일 속성이 참조되는 많은 다른 위치가 있으므로 객체를 만들고 새 속성을 추가하는 데 많은 시간이 걸립니다.
그래서 ... 아이디어가있었습니다. 먼저 Joshua 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();
}
}
내 "개선 된 버전"에서 볼 수 있듯이 추가 속성 (또는이 경우 옵션)에 대한 코드를 추가해야하는 곳이 2 개 더 적습니다! 내가 볼 수있는 유일한 부정적인 점은 외부 클래스의 인스턴스 변수가 최종적이 될 수 없다는 것입니다. 그러나 클래스는 이것 없이는 여전히 불변입니다.
이러한 유지 보수성 개선에 대한 단점이 있습니까? 그가 보지 못한 중첩 클래스 내에서 속성을 반복 한 이유가 있어야합니까?