У меня есть вопрос относительно образца образца шаблона Abstract Factory из книги Design Patterns.Дизайн шаблонов - Абстрактная фабрика - 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);
}
}
Автор (ы), а затем определить специализацию 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 *, однако завод возвращает комнату *.
Чтобы реализовать логику игры в лабиринте, я бы предположил, что вам нужно будет проверить, содержит ли в комнате бомбу, но Room * не знает о бомбах. Единственный способ узнать, есть ли в комнате бомба, - это отличить комнату * от RoomWithABomb *, что плохой практикой?
Является ли их пример не очень хорошо продуманным или существует какой-либо другой способ обработки таких случаев?
Если в каждой комнате был метод Enter(), это может быть переопределено в подклассе RoomWithABomb и иметь логику случайного включения бомбы. – dbugger