はい、絶対に、ドア、壁、および部屋で構成される完全に構成された世界を作成することを仕事とする単純な 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 オブジェクトを解放します。