私は最近、Code Reviewで私のJavaの回答を削除しました。
private Person(PersonBuilder builder) {
やめる。赤旗。PersonBuilderはPersonを構築します。それは人について知っています。PersonクラスはPersonBuilderについて何も知らないはずです-それは単なる不変の型です。ここで、Aに依存するBに依存するAに依存する循環カップリングを作成しました。
Personはパラメータを取得するだけです。構築せずにPersonを作成するクライアントは、それを実行できる必要があります。
私は下票で平手打ちされ、それを(引用して)赤旗と言った、なぜ?ここでの実装は、Joshua Blochが彼の「Effective Java」本(アイテム#2)で示したものと同じ形をしています。
したがって、Javaでビルダーパターンを実装する正しい方法は、ビルダーをネスト型にし(これはこの質問の目的ではありません)、製品を作成することです(ビルドされているオブジェクトのクラス)このように、ビルダーに依存します:
private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; }
同じBuilderパターンの同じWikipediaページには、C#の実装が大きく異なります(そして、はるかに柔軟です)。
//Represents a product created by the builder public class Car { public Car() { } public int Wheels { get; set; } public string Colour { get; set; } }
ご覧のとおり、ここの製品はBuilder
クラスについて何も知らないため、直接コンストラクター呼び出し、抽象ファクトリー、またはビルダーによってインスタンス化できることに気をつけています-私が理解している限り、創造的なパターンの製品は、それを作成しているものについて何も知る必要はありません。
私は、ビルダーパターンを使用して、コンストラクターが多数のオプション引数で肥大化するような型を作り直すことができるという反論(明らかにBlochの本で明らかに防御されている)を受けました。だから、私はこのサイトで少し研究したと思っていたと思っていたものに固執する代わりに、私が疑ったように、この議論は水を保持していないことがわかった。
それで、取引は何ですか?そもそも存在してはならない問題に対して、過剰に設計されたソリューションを考え出すのはなぜですか?ジョシュアブロッホを台座から1分間離すと、2つの具体的なタイプを結合し、それをベストプラクティスと呼ぶ1つの正当な理由を見つけることができますか?
これはすべて、私にとってカーゴカルトプログラミングの続きです。