我有一个关于设计模式书中的抽象工厂模式示例代码的问题。设计模式 - 抽象工厂 - BombedMazeFactory
这本书提出了一个迷宫游戏的简单和部分的例子,其中有连接房间的墙壁和门。
有它具有以下的工厂方法基本MazeFactory类:
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);
}
}
作者(S),然后定义MazeFactory的专业化:
class BombedMazeFactory : public MazeFactory {
BombedMazeFactory();
virtual Room* MakeWall() const { return new BombedWall; }
virtual Door* MakeRoom(int n) const { return new RoomWithABomb(n); }
};
我完全不知道怎么样RoomWithABomb应该可以工作,但可以说它创造了一个房间,其中有5%的机会容纳一个炸弹,如果你打开一个门,其中包含一个爆炸的房间,你爆炸。
现在让我们说客户使用BombedMazeFactory类创建他们的迷宫并创建一些房间。创建的房间类型为RoomWithABomb *,但工厂返回一个房间*。
为了实现一些迷宫游戏逻辑,我假设你需要检查一个房间是否包含炸弹,但是房间*没有关于炸弹的知识。我们能够找出房间是否含有炸弹的唯一方法是将房间*改为RoomWithABomb *这是不正确的做法吗?
他们的例子不是很好的想法或者是否有其他方式来处理这种情况?
如果每个房间都有一个Enter()方法,则可以在RoomWithABomb子类中覆盖此方法,并具有随机设置炸弹的逻辑。 – dbugger