24

Builder パターン(C#) の良い例を探しましたが、Builder パターンを理解していないか、意図していないことをしようとしているために、見つけることができません。たとえば、抽象自動車と自動車部品を作成する抽象ビルダー メソッドがある場合、選択した 30 個すべてをディレクターに送信し、必要な部品を作成してから自動車を作成する必要があります。どの車、トラック、セミなどを製造しても、まったく同じように「運転」できるはずです。

最初の問題は、具体的な部分にハードコードされたプロパティ値のほとんどの例です。これは、データベースから取得する必要があると思います。私のアイデアは、(データ ソースから) ディレクターに私の選択を送信し、ビルダーに私のデータに基づいてカスタマイズされた製品を作成させることだと思いました。

2番目の問題は、ビルダーメソッドで実際にパーツを作成してから、文字列を渡すのではなく、実際に強く型付けされた製品パーツを製品に割り当てることです。

たとえば、ビルダーにラベル、入力セクション、検証などを含むフォームフィールドを作成させることで、オンザフライでフォームを作成したいと考えています。このようにして、ORM からオブジェクトを読み取り、オブジェクトのメタデータをチェックアウトできます。 、これを Builder に渡し、新しく作成したユーザー コントロールの結果を Web フォームに追加します。

ただし、私が見つけたすべての Builder の例には、メイン コードから Builder に選択肢を渡してカスタマイズされた製品を追い出すのではなく、ハード コーディングされたデータしかありません。すべてが大きな静的ケースステートメントのようです。たとえば、それぞれ 10 の選択肢を持つ 3 つのパラメーターがある場合、30 の具体的な Builder メソッドを構築したくありません。製品に必要なプロパティを作成するのに十分なだけ作成したいのですが、それは 3 つだけかもしれません。

Director はメイン コードだけに存在させたいと思っています。パターン内で case ステートメントを使用する代わりに、ポリモーフィズムやメソッドのオーバーロード (非常に悪い例ですが) と同様に、どの具体的なビルダー メソッドを呼び出すかを自動的に決定する方法が必要です。(新しい製品タイプを追加する必要があるたびに、既存のディレクターを変更する必要がありますが、これは悪いことです)。

4

4 に答える 4

23

ほとんどの BuilderPattern の呼び出しは次のようになります。

Car car = new CarBuilder().withDoors(4).withColor("red").withABS(true).build();
于 2009-03-30T05:40:34.303 に答える
14

私はこのように考えたことはありませんが、LINQ(構文ではなくパターン)は実際にはビルダーですよね?

これは、クエリを構築し、さまざまな表現でクエリを作成できる流暢なインターフェイスです(SQL、メモリ内オブジェクトクエリ、Webサービスクエリ、Bart de SmetはLinq-to-Excelの実装も作成しました)。

于 2009-03-30T09:43:02.723 に答える
11

ここでは、ウィキペディアの記事の C# の例を参照します。

最初の問題は、具体的な部分にハードコードされたプロパティ値のほとんどの例です。これは、データベースから取得する必要があると思います。私のアイデアは、(データ ソースから) ディレクターに私の選択を送信し、ビルダーに私のデータに基づいてカスタマイズされた製品を作成させることだと思いました。

この場合、データベースからデータを取得する方法を知っている PizzaBuilder を実装するクラスがあります。いくつかの方法があります。

1 つは、HawaiianPizzaBuilder を作成することです。クラスが初期化されると、ハワイアン ピザのデータベースをクエリし、行を取得します。その後、さまざまな Build(x) メソッドが呼び出されると、取得したデータベース行の対応するフィールドにプロパティが設定されます。

もう 1 つは、PizzaDatabaseBuilder を作成し、クラスを初期化するときに、そのタイプのピザに必要な行の ID を渡すようにすることです。たとえば、代わりに

waiter.PizzaBuilder = new HawaiianPizzaBuilder();

あなたが使う

waiter.PizzaBuilder = new PizzaDatabaseBuilder("Hawaiian");

2番目の問題は、ビルダーメソッドで実際にパーツを作成してから、文字列を渡すのではなく、実際に強く型付けされた製品パーツを製品に割り当てることです。

問題になるべきではありません。必要なのは、Pizza のフィールドを初期化するための別の Factory/Builder タイプのパターンです。例えば

それ以外の

 public override void BuildDough()   { pizza.Dough   = "pan baked"; }

あなたは次のようなことをします

 public override void BuildDough()   { pizza.Dough   = new DoughBuilder("pan baked"); }

また

 public override void BuildDough()   { pizza.Dough   = new PanBakedDoughBuilder(); }

DoughBuilder は、データベース内の別のテーブルに移動して、PizzaDough クラスを適切に埋めることができます。

于 2009-03-30T12:29:39.780 に答える