デザインパターンブックのAbstract Factoryパターンサンプルコードに関する質問があります。デザインパターン - 抽象ファクトリ - BombedMazeFactory
この本は、部屋を接続する壁と扉がある迷路ゲームの簡略化された部分的な例を示しています。
次のファクトリメソッドを持っている基本的なMazeFactoryクラスがあります:私は正確にどのように知りません
class BombedMazeFactory : public MazeFactory {
BombedMazeFactory();
virtual Room* MakeWall() const { return new BombedWall; }
virtual Door* MakeRoom(int n) const { return new RoomWithABomb(n); }
};
:
class MazeFactory {
public:
MazeFactory();
virtual Maze* MakeMaze() const { return new Maze; }
virtual Wall* MakeWall() const { return new Wall; }
virtual Room* MakeRoom(int n) const { return new Room(n); }
virtual Door* MakeDoor(Room* r1, Room* r2) const {
return new Door(r1, r2);
}
}
が、その後MazeFactoryの特殊化を定義する著者(複数可) RoomWithABombは動作するはずですが、爆弾が入っている可能性が5%の部屋を作成し、爆発した爆弾部屋を含む扉を開けると言うことができます。
ここで、クライアントがBombedMazeFactoryクラスを使用して迷路を作成し、いくつかの部屋を作成するとします。作成されたルームはRoomWithABomb *タイプですが、ファクトリはRoom *を返します。
いくつかの迷路のゲームロジックを実装するには、部屋に爆弾が含まれているかどうかを確認する必要があると思いますが、Room *は爆弾に関する知識がありません。部屋に爆弾が含まれているかどうかを調べる唯一の方法はRoom *をRoomWithABomb *にキャストすることです。これは悪い習慣ですか?
例はあまりよく考えられていないのですか、またはこのようなケースを処理する他の方法がありますか?
各部屋にEnter()メソッドがある場合、これはRoomWithABombサブクラスでオーバーライドして、ランダムに爆弾を設定するロジックを持つことができます。 – dbugger