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

来源:互联网 发布:淘宝卖家违规几次封号 编辑:程序博客网 时间:2024/06/06 16:16

抽象工厂模式的结构如图:


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);