我有一個關於設計模式書中的抽象工廠模式示例代碼的問題。設計模式 - 抽象工廠 - 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