GoFによる元のBuilderパターンと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
は不変であると言われていますが、後で別のプログラマーが来てセッターを追加するのを妨げるものはありません。
第2に、Hansenのビルドメソッドのコメントには、「作成前の検証がここにあります」というコメントがあります。ブロッホ(EJ 2ED P.15)は言う:
[不変式]はオブジェクトにビルダーからパラメータをコピーした後にチェックすることが重要である、と彼らはではなく、オブジェクトフィールドにチェックすることビルダー項目(項目39)。
アイテム39(P 185)に反転する場合は、推論を参照してください。
[これ]は、間の「脆弱性の窓」の間に別のスレッドからのパラメータの変化に対して、クラスを保護パラメータがチェックされた時刻とコピーされた時刻。
Widget
で
フィールドは不変であり、任意の守備のコピーを必要としませんが、それにもかかわらず、それは、誰かが一緒に来て、後でDate
配列やあるいは何らかの可変Collection
を追加する場合には、単に正しいパターンに固執する方が安全です。 (それはまたbuild()
への呼び出しの途中でBuilder
を修正し、別のスレッドから保護しますが、それはおそらく最高のちょうどBuilder
sはスレッド間で共有されていないことを確認していますので、それは安全性のかなり狭いウィンドウです。)
Aより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. ビルダーパターン:ディレクターのポイントは何ですか?
- 2. ビルダーパターン、テンプレート、ネストされたクラス
- 3. Rails CSSとJavaScriptで修正された&CSSEditが修正されましたか?
- 4. Cで修正された同等の機能は何ですか#
- 5. gitで各ファイルが何回修正されたかを数えるには?
- 6. extjsグリッドで修正された水平スクロールバーを修正するには?
- 7. Git-Flowは、完成した/修正された修正プログラムブランチを元に戻す
- 8. IE9で修正されたメニュー分割
- 9. ToolkitScriptManagerで修正されたScriptManager
- 10. スタティックC#で修正されたThreadStatic#
- 11. ドロップダウンで修正されたナビゲーション
- 12. イタリックで修正されたR ylabライン
- 13. ビルダーパターンとフライウェイトパターンの違いは何ですか?
- 14. perspective()の問題はパースペクティブで修正されましたか?
- 15. 手動で修正された逆アセンブルされたアセンブリのアドレスを自動修正するツール
- 16. Config.Eager_loadとは何ですか、どうすれば修正できますか?
- 17. Androidは修正されたJavaマシンを実行しますか?
- 18. 私はCコードで何を修正すべきですか?
- 19. `Request.GetNextPageLink`で廃止されたAPIを修正するには?
- 20. 修正されたスーパークラスをJavaでロードするには?
- 21. AspectJで修正されたインスタンスを選択する方法は?
- 22. 修正されたクラスをPythonでインポートするには?
- 23. 私は唇の上にAdobe After Effectsの股間/腫れた部分を修正したい。それを修正する最良の方法は何ですか?
- 24. URLが修正されたFirebaseクラッシュログ
- 25. ネストされた子の修正
- 26. リダイレクトされたパケット+修正 - Pcap.Net
- 27. 修正されたinnerHTMLはページに表示されません
- 28. ナビゲーションプロパティを修正するためにEntity Frameworkがトリガされる要因は何ですか?
- 29. Netbeansで「修正名」とは何ですか?
- 30. ValidationSummaryは、エラーが修正された後に表示されますか?
あなたの例では、偽の(または不足している、不安定な)プロパティを持つBuilderのインスタンスを作成し、「新しいウィジェット(myBogusBuilder)」を呼び出し、ウィジェットの「不安定な」インスタンスになることは許されませんか? (例えば、build()メソッドでしかチェックしていないので、値が少なくとも "1"以上であることを検証しないでください) – Rafa
ウィジェットコンストラクタがpublicであってもプライベートだとしたら、それを(クラスの外から)呼び出す唯一の方法は、build()です。 –
ああ、真;気づかなかった(私の眼鏡を見直すつもり...)。ありがとう:) – Rafa