关于 抽象工厂 模式中, 同一系列产品间互相引用的问题
解释一下. 因为通过抽象工厂创建, 在ConcreteMaze里面只存有Room的指针, 而在ConcreteMaze::CreateMonsterInMaze()里面, 我需要调用ConcreteRoom::IsPointInside(). 同时, 因为客户代码不需要知道IsPointInside()这个方法所以我不想把这方法放到Room基类里面.
我的问题就是, 怎样修改代码能在ConcreteMaze里调用ConcreteRoom::IsPointInside的时候不用写dynamic_cast?
即"在抽象工厂内, 同一系列的产品间互相引用, 如何在不把接口提到基类的情况下去掉dynamic_cast"
C/C++ code
struct Maze
{
virtual void AddRoom(Room*) = 0;
virtual void SthMustDo() = 0;
};
struct Room
{};
struct ConcreteMaze : public Maze
{
virtual void AddRoom(Room* r){mRoomVector.push_back(r);};
void CreateMonsterInMaze()
{
//balabalabala~~
POINT monsterPosition;
ConcreteRoom* room = dynamic_cast<ConcreteRoom*>(*mRoomVector.begin());
room->IsPointInside(monsterPosition);
//balabalabala~~
}
virtual void SthMustDo(){CreateMonsterInMaze();};
vector<Room*> mRoomVector;
};
struct ConcreteRoom : public Room
{
bool IsPointInside(POINT){}
};
struct MazeFactory
{
virtual Maze* CreateMaze() = 0;
virtual Room* CreateRoom() = 0;
};
struct ConcreteMazeFactory
{
virtual Maze* CreateMaze(){return new ConcreteMaze};
virtual Room* CreateRoom(){return new ConcreteRoom};
};
void ConstructMaze(const MazeFactory* f)
{
Maze* m = f->CreateMaze();
Room* r = f->CreateRoom();
m->AddRoom(r);
m->SthMustDo();
}
void main()
{
ConcreteMazeFactory factory;
ConstructMaze(&factory);
}
[解决办法]
可以把IsPointInside()提升到类Room里,这样就用不着向下转换。
//ConcreteRoom* room = dynamic_cast<ConcreteRoom*>(*mRoomVector.begin());
//room->IsPointInside(monsterPosition);
俺感觉这SthMustDo()像是用来处理迷宫表现的,builder好像比较合适些。(就设计意图而言)
monster类似builder中例子的door。(gof书中的例子)