5

Builder 設計パターンを実装できるかどうか疑問に思っていますが、具体的なビルダーを派生させるインターフェイス/抽象クラスがありませんか? ビルダーを 1 つだけ持つことはできますか?

私がconcretebuilderとdirectorだけを持っている場合、それはまだビルダーデザインパターンですか?

もう少し詳しく言うと:

複雑なオブジェクトに「まとめ」たいオブジェクトがあります。より正確には、次のクラスがあります。

ドアウォールルーム

これらのクラスから「世界」を構築したいと思います。つまり、これらすべてのクラスを組み合わせて世界が得られます。

ありがとう

4

3 に答える 3

3

はい、絶対に、ドア、壁、および部屋で構成される完全に構成された世界を作成することを仕事とする単純な WorldBuilder を持つことができます。これは、部分的に構築された、おそらく無効な World オブジェクトを公開したくない場合に非常に便利です。

ビルダーの使用法が次のようになっているとしましょう。

WorldBuilder builder = new WorldBuilder();

// read the definition of a room from an XML file or other source.
// this is vastily simplified, you'd probably be iteration 
// something like this:
//
//   for each Room in file
//      for each wall in room
//         for each door in wall
//
roomId = readRoomId();
wallId = readWallId();
doorId = readDoorId();
destRoomId = readDestinationRoomId();

builder.AddRoom(roomId);
builder.AddWallToRoom(roomId, wallId, SIDE.NORTH);
builder.AddDoorToWall(wallId, DOORSTYLE.WOODEN | DOORSTYLE.LOCKED, destRoomId);

// etc, etc

World world = builder.makeWorld();

ビルダー以外のアプローチでは、次のようにして 2 つのルーム オブジェクトを接続する必要がある場合があります。

Door door = new Door(roomOne, roomTwo);

ただし、以前のようにファイルから各部屋を反復していた場合、2 番目の部屋への参照はありません。まだ到達していない可能性があるためです。

別の方法として、各オブジェクトに隣接オブジェクトまたは親の ID だけを指定して、代わりにこれを取得する方法があります。これにより、まだロードされていないオブジェクトを参照できるようになります。

Door door = new Door(roomOneId, roomTwoId);

しかし、ファイルにエラーがあり、部屋 2 が定義されていない場合、World は無効になります。

Builder は、World 作成プロセスの適切な構築、接続、および検証のすべての詳細を処理し、World を作成したいクライアント コードに柔軟性を与え、複雑な構築ロジックの World オブジェクトを解放します。

于 2012-09-21T15:45:55.670 に答える
2

ビルダー パターンをビジター パターンと組み合わせることができます。それぞれがメソッドを実装するある種のデータ ツリーをビルダーにaccept(Visitor v)渡し、ビルダーにツリーをたどらせて、accept メソッドを介して各ノードをビジターに渡します。

于 2012-09-20T20:13:28.070 に答える
2

私がconcretebuilderとdirectorだけを持っている場合、それはまだビルダーデザインパターンですか?

私は最初からこの質問にとらわれませんでした。プロジェクトで 1 つのタイプの「ワールド」のみを構築する必要があり、実際に複数のビルダー サブクラスを必要としない場合は、ディレクターと単一の具象ビルダーを使用するのが有効なアプローチです。代わりに、パターンの精神に焦点を当てます。つまり、ディレクターを世界の構築方法の詳細から分離します。

コードが機能し、結果に満足したら、戻って、ディレクターとビルダーが実際にどのように相互作用するかを確認してください。次に、ビルダーをリファクタリングして共通のインターフェイスを抽出し、ディレクターとビルダーの間の契約を実際に明確にすることを検討してください。

実用的な具象クラスから適切なインターフェイスを抽出し、このインターフェイスが何であるかを前もって推測して、インターフェイスとクラスを同時に開発しようとする方がはるかに簡単であることがわかりました。

于 2012-09-20T21:33:15.813 に答える