您的位置:首页 > 其它

设计模式--抽象工厂模式

2013-11-27 00:32 246 查看
抽象工厂模式的结构如图:



enum Direction
{North, South, East, West};

class MapSite//迷宫组件基类
{
public:
virtual void Enter() = 0;
};

class Room : public MapSite
{
public:
Room(int roomNo);
MapSite* GetSide(Direction) const;
void SetSide(Direction, MapSite*);
virtual void Enter();
private:
MapSite* _sides[4];
int _roomNumber;
};

class Wall : public MapSite
{
public:
Wall();
virtual void Enter();
};

class Door : public MapSite
{
public:
Door(Room* r1 = 0, Room* r2 = 0);
virtual void Enter();
Room* OtherSideFrom(Room*);
private:
Room* _room1;
Room* _room2;
bool _isOpen;
};

class Maze
{
public:
Maze();
void AddRoom(Room*);
Room* RoomNo(int) const;
private:
//...
};

/************************************************************************/
/*                   抽象工厂模式代码示例                               */
/************************************************************************/

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);
}
private:
};

class EnchantedMazeFactory : public MazeFactory
{
public:
EnchantedMazeFactory();

virtual Room* MakeRoom(int n) const
{
return new //返回带咒语的房间
}

virtual Door* MakeDoor(Room* r1, Room* r2) const
{
return new //返回带咒语的门
}
private:
//...
};

class BombeMazeFactory : public MazeFactory
{
public:
BombeMazeFactory();

virtual Wall* MakeWall() const
{
return new//返回有炸弹的墙
}

virtual Room* MakeRoom(int n) const
{
return new //返回有炸弹的房间
}
private:
};

class MazeGame;//MazeGame创建迷宫的类
//抽象工厂作为引用参数(或者指针参数)传递给用户调用
Maze* MazeGame::CreateMaze(MazeFactory& factory)
{
Maze* aMaze = factory.MakeMaze();
Room* r1 = factory.MakeRoom(1);
Room* r2 = factory.MakeRoom(2);
Door* aDoor = factory.MakeDoor(r1, r2);

aMaze->AddRoom(r1);
aMaze->AddRoom(r2);

r1->SetSide(North, factory.MakeWall());
r1->SetSide(East, aDoor);
r1->SetSide(South, factory->MakeWall());
r1->SetSide(West, factory->MakeWall());
r2->SetSide(North, factory.MakeWall());
r2->SetSide(East, factory->MakeWall());
r2->SetSide(South, factory->MakeWall());
r2->SetSide(West, aDoor);

return aMaze;
}

/************************************************************************/
/*                          模式应用                                    */
/************************************************************************/

Maze* aMaze = NULL;
MazeGame game;
BombeMazeFactory factory;

aMaze = game.CreateMaze(factory);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: