2009-05-03 13 views
4

私はそれについて読んだことがあります、それは基本的な機能であることを理解しています - 私は、このパターンのための共通の、実使用の例を知りたいと思います。ビルダーデザインパターンの実際の使用は何ですか?

参考までに、私はMicrosoftのスタックを使用してビジネスアプリケーション、Web、およびWindowsを中心に作業しています。

答えて

5

Think in an Itinerary builder。あなたがあなたに加えることができるものはたくさんあります。ホテル、レンタカー、航空会社のフライト、それぞれのカーディナリティなどの旅程は0〜*です。アリスには車とホテルがあり、ボブには2つのフライト、車と3つのホテルはありません。

コンクリート工場または抽象工場を作成して旅程を吐くことは非常に難しいでしょう。あなたが必要とするのは、異なるステップを持つことができる工場、特定のステップが起こるファクトリー、作成プロセスの結果として非常に異なるタイプのオブジェクトを生成しないファクトリーです。

一般的には、工場で作業を開始し、プロセスに対してより高い粒度制御が必要な場合にのみ、ビルダーに行ってください。

また、Data & Object Factoryには、説明、コード例、UMLがあります。

+0

合意!私たちのソフトウェアでは、Builderパターンを実装しますが、基本オブジェクトはFactoryオブジェクトの結果として作成され、必要なコンポーネントが追加されます。 私の答えは現実世界のコーディング例のほうが多く、現実世界のより抽象的な視点から見ると+1です。 – jeremyalan

1

EDIT:私のコメントでは、この質問に答えるために急いで、プロセスに混乱していることがわかります。抽象ファクトリで動作するようにこれを編集しますが、これは元々意図していたと思いますが、これは主に参照用であり、必ずしも元の質問に対する応答ではないことに注意してください。

私が見てきた最も一般的な例は、GUIコンポーネントの構築方法を扱っています。

たとえば、アプリケーションのフォームを設計していて、そのGUIコンポーネントが複数の表現(おそらく実行しているプラ​​ットフォームに基づいている)を持っている場合は、これらのコンポーネントの作成を処理する抽象ファクトリを設計します。あなたが別の表現を作成するファクトリオブジェクトの別のインスタンスを作成することができますので

public MyForm() 
{ 
    GuiFactory factory = new Win32Factory(); 
    Button  btn = factory.CreateButton(); 

    btn.Text = "Go!" 
    btn.Location = new Point (15, 50); 

    this.Controls.Add (btn); 
} 

これはAbstract Factoryパターンを満たす:フォームに新しいコントロールを追加するために

、コードは次のようになります。クライアントコードを変更せずに作成したオブジェクト(これは初歩的な例ですが、通常は新しいものを使用してWin32Factoryを作成しないと思いますが、他の抽象化によって取得されます)。

+0

MyFormを()はthis.Controls.Add(builder.BuildGoButtonを())を呼び出しますように、実際のビルダーはあなたの例では、ボタンを返しますので、私は、ビルダーは、建物をカプセル化するという印象の下にありました。例えば。 –

+0

ええ、私はそれについてもっと考えると、私は私の応答を残して私のワイヤーが交差していたと思う。 GUIの考え方では、あなたが実行しているプラ​​ットフォームに応じて、Buttonのさまざまな表現を作成する抽象ファクトリの考え方にあったでしょう。 – jeremyalan

0

私たちが常時見てきた共通の例は、オペレーティングシステムの「sysgen」でした。必要なモジュールをすべて選択して構成し、カスタマイズされたブータブルイメージを返すプロセスがありました。

5

キーの使用事例:

  • 最終結果は不変であるが、私は、部分的に部分的に 何かと再利用を構築したい場合は はコンストラクタでそれをすべて行うと
  • あまりにも複雑になるとき組み立てたものですが、それをカスタマイズするときは を毎回末尾にします
  • 工場パターンではじめて、 によって構築されているものは、あまりにも多くの順列

要約すると、ビルダーはコンストラクタをシンプルに保ちながら、不変性を許可します。

あなたは、C#が言ったが、ここでは些細なJavaの例です:とは対照的に、

StringBuilder sb = new StringBuilder(); 
sb.append("Hello"); 
sb.append(" "); 
sb.append("World!"); 
System.out.println(sb.toString()); 

:複数のデータソースを持つときに私が遭遇した

String msg = ""; 
msg += "Hello"; 
msg += " "; 
msg += "World!"; 
System.out.println(msg); 
+0

StringBuilderの例はC#でもほとんど同じです。 – LukeH

+0

+1おそらく最も完璧な例です。そして、system.out.println(...)とは別に、それはC#でコンパイルされ、正しいものになります。 –

0

つのユースケースがあります。特定のケースには、キャッシュとデータベースが含まれていました。データの大半はキャッシュから取り出されたものであるかどうかはわかりません。第2のローダーは、データを見て、それがキャッシュからロードされたかどうかを調べる。データベースにクエリを実行してデータの入力を完了します。

0

non-software related example of design patternsを理解するために役立つことがあります。

私は現在、ビルダーを使用して注文を作成するシステムを持っています。順序は、いくつかの他のクラスで構成されたクラスです。私のビルダーは、関連付けられたクラスを作成して検証し、すべてが有効な場合は、そのクラスのインスタンスを作成します。こうすることで、データが欠落している注文のインスタンスが決してないことが確かめられます。

関連する問題