2012-09-20 8 views
5

私はビルダーのデザインパターンを実装できるのだろうか?具体的なビルダーを派生させるインターフェース/抽象クラスを持たないのだろうか?ビルダーを1人だけ持つことはできますか?ビルダーのデザインパターン - 抽象クラス/インターフェースなし

私は単にコンクリートビルダーとディレクターを持っていれば、それはまだビルダーデザインパターンですか?

具体的には:

私は複雑なオブジェクトに「まとめ」にしたいいくつかのオブジェクトを持っています。私は以下のクラスを持って、より正確なもの:

ドア ウォール ルーム

が、私はこれらクラッセのうち、「世界」を構築したい、それが結合されたすべてのこれらのクラスは私に世界を与えています。

おかげ

答えて

2

あなたはvisitor patternとBuilderパターンを組み合わせることができ:accept(Visitor v)メソッドを実装し、それぞれが、ビルダーへのデータツリーのいくつかの種類を渡し、そしてビルダーが背面に各ノードを渡してツリーを歩いてきましたacceptメソッドを使用して訪問者。

+0

こんにちは。 Imはビルダーパターンを使用することを許可しました。 – mrjasmin

2

コンクリートビルダーとディレクターがいればビルダーのデザインパターンはまだありますか?

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

コードが機能していて、結果に満足すれば、元に戻り、ディレクターとビルダーが実際にやりとりする方法を確認します。次に、ビルダーをリファクタリングして、共通のインターフェースを抽出し、ディレクターとビルダーの間の契約を実際に縛ることを検討してください。

実用的な具体的なクラスから賢明なインターフェイスを抽出し、このインターフェイスが何であるかを推測し、インターフェイスとクラスを同時に開発しようとする方がずっと簡単です。

3

はい、まったく簡単なWorldBuilderの仕事は、ドア、壁、お部屋からなる完全に構成された世界を作成することです。これは、部分的にビルドされ、おそらく無効なWorldオブジェクトが公開されることを望まない場合に非常に便利です。

のは、ビルダーの使用量がこのようなものですとしましょう:2つの部屋のオブジェクトを接続するには、このような何かをしたいと思うかもしれません

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(); 

非ビルダーのアプローチ:

Door door = new Door(roomOne, roomTwo); 

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

別のアプローチは、あなたがまだロードされていないオブジェクトを参照することを可能にする、あなたの代わりにこれを取得するように、各オブジェクトに、その隣人や親だけのIDを与えることです:

Door door = new Door(roomOneId, roomTwoId); 

しかし、もしファイルにエラーがあり、部屋2が決して定義されなかった場合、世界は無効になります。

ビルダーは、ワールド作成プロセスを適切に構築、接続、検証し、ワールドを作成したいクライアントコードに柔軟性を与え、複雑な構築ロジックのWorldオブジェクトを再利用することのすべての詳細を処理できます。

+0

ありがとうございます。これは私が検討したaproachです。私はディレクターが必要ないと思いますか? – mrjasmin

+0

私は、XMLファイルがディレクターになるという繰り返しのサンプルコードを投稿しました。あなたは、DBからデータを取り出した別のディレクターを同じように簡単に持つことができます。ビルダーはどちらの場合も同じままで、ディレクターとビルダーの間に明確な分離を可能にします。 – tcarvin