GoF의 원래 작성기 패턴과 Joshua Bloch의 "GoF Builder 개정 패턴"의 차이점은 무엇입니까?개정 된 빌더 패턴은 무엇입니까?
답변
GoF 패턴은 작성 단계를 추상화하여 "수정 된 빌더"가 여러 생성자가 추가 한 불필요한 복잡성 문제를 해결하는 동안 다른 결과를 얻을 수 있도록합니다. 따라서 GoF 패턴은 추상화에 대한 것이고 수정 된 패턴은 단순성 (IMO)에 관한 것입니다.
http://en.wikipedia.org/wiki/Builder_pattern 및 http://rwhansen.blogspot.com/2007/07/theres-builder-pattern-that-joshua.html의 예를 살펴보고 명확해야합니다.
참고 Mikko's answer : Hansen's example에는 블로흐 버전과의 차이점이 있지만, 블로흐 버전이 우수하다고 생각합니다.
구체적 :
먼저 Widget
의 필드 대신 Widget
생성자보다 Builder.build()
설정되어 있으므로되어 있지 (할 수없는) final
. Widget
은 불변이라고하지만, 나중에 다른 프로그래머가 들어가서 세터를 추가하는 것을 막을 수는 없습니다.
둘째, Hansen의 빌드 방법에 대한 의견은 "사전 생성 유효성 확인은 여기에 있습니다."라고 말합니다. 블로흐 (. EJ 2ed 15 페이지)는 말한다 :
[불변성이] 개체에 빌더에서 매개 변수를 복사 한 후 확인하는 것이 중요하고, 그들이 아닌 개체 필드에서 확인할 수 있음 빌더 필드 (항목 39). "취약점의 창"사이의 기간 동안
는 [이 다른 스레드에서 매개 변수에 대한 변경에 대한 클래스를 보호 : 당신이 항목 39 플립 경우
는 (. P 185) 당신은 이유를 참조 매개 변수를 검사하는 시간 및 매개 변수가 복사되는 시간
Widget
에서
필드는 불변하고 방어 복사를 필요로하지 않는,하지만 그럼에도 불구하고 누군가가 나타나서 나중에 Date
배열이나 또는 일부 변경할 수 Collection
을 추가하는 경우, 단지 올바른 패턴에 충실 안전합니다 . (또한 build()
에 대한 호출의 중간에 Builder
을 수정하는 다른 스레드에 대해 보호 할뿐만 아마 최고의 단지 Builder
의이 스레드간에 공유되지 확인하기 위해, 그래서 그 안전의 매우 좁은 창입니다.)
더 Blochlike 버전은 다음과 같습니다
public class Widget {
public static class Builder {
private String name;
private String model;
private String serialNumber;
private double price;
private String manufacturer;
public Builder(String name, double price) {
this.name = name;
this.price = price;
}
public Widget build() {
Widget result = new Widget(this);
// *Post*-creation validation here
return result;
}
public Builder manufacturer(String value) {
this.manufacturer = value;
return this;
}
public Builder serialNumber(String value) {
this.serialNumber = value;
return this;
}
public Builder model(String value) {
this.model = value;
return this;
}
}
private final String name;
private final String model;
private final String serialNumber;
private final double price;
private final String manufacturer;
/**
* Creates an immutable widget instance.
*/
private Widget(Builder b) {
this.name = b.name;
this.price = b.price;
this.model = b.model;
this.serialNumber = b.serialNumber;
this.manufacturer = b.manufacturer;
}
// ... etc. ...
}
모든 Widget
필드는 이제 final
이며, 모두 건설 후 확인됩니다.
- 1. OCaml의 "개정 된 구문"은 무엇입니까?
- 2. 인용 된 텍스트의 적절한 Lua 패턴은 무엇입니까?
- 3. 어려운 패턴은 무엇입니까?
- 4. 저장소의 사양 패턴은 무엇입니까?
- 5. 통화 변환을위한 디자인 패턴은 무엇입니까?
- 6. 이 애플리케이션의 디자인 패턴은 무엇입니까?
- 7. 일반적인 3D 게임 패턴은 무엇입니까?
- 8. NSNumberFormatter에 적합한 코드 패턴은 무엇입니까?
- 9. AOP의 기본 디자인 패턴은 무엇입니까?
- 10. 전략에 맞는 디자인 패턴은 무엇입니까?
- 11. 웹 프로그래밍의 일반적인 패턴은 무엇입니까?
- 12. 정규식 패턴의 정규식 패턴은 무엇입니까?
- 13. aspnet mvc에서 사용할 패턴은 무엇입니까?
- 14. 이 패턴은 무엇입니까? 소프트 록?
- 15. 이 시나리오에서 사용할 패턴은 무엇입니까?
- 16. Struts 1.x 프레임 워크에서 사용 된 디자인 패턴은 무엇입니까?
- 17. 깊게 중첩 된 웹 양식 유효성 검사의 패턴은 무엇입니까?
- 18. 개정, 이차 시간
- 19. 병합 문제 : 병합을 선택해야하는 개정 본은 무엇입니까?
- 20. 개정 본이 실제로 무작위입니까
- 21. '색상'구조에 가장 적합한 디자인 패턴은 무엇입니까?
- 22. SharpSVN에서 최신 개정 번호를 얻는 방법은 무엇입니까?
- 23. VisualSVN 개정 번호를 롤백하는 방법은 무엇입니까?
- 24. Rails XML 빌더 (예 : 축소 된 XML)
- 25. 창을 관리 할 디자인 패턴은 무엇입니까?
- 26. 이메일 템플릿의 추천 디자인 패턴은 무엇입니까?
- 27. 일반적인 Windows 서비스 디자인 패턴은 무엇입니까?
- 28. Rails 원격 데이터베이스의 위임 패턴은 무엇입니까?
- 29. 단순한 ORM 쿼리를 구성하는 디자인 패턴은 무엇입니까?
- 30. 소셜 네트워크 유형 애플리케이션을 구축하기위한 패턴은 무엇입니까?
가짜 (또는 누락 된 불안정한) 속성이있는 Builder 인스턴스를 만든 다음 "새 위젯 (myBogusBuilder)"을 호출하고 위젯의 "불안정한"인스턴스로 끝낼 수 없습니까? (예를 들어, build() 메소드에서만 확인했기 때문에 그 가격은 적어도 "1"이상이어야 함을 확인하지 않음). – Rafa
위젯 생성자가 public이지만 사적인 것입니다. 클래스 밖에서 호출하는 유일한 방법은 build()를 사용하는 것입니다. –
오, 참; did not는 그것을 알아 차린다 (나의 안경을 검토 할 것이다. ..). thanks :) – Rafa