设计模式--抽象工厂模式
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);
相关文章推荐
- 设计模式学习-----抽象工厂模式
- C#设计模式编程之抽象工厂模式新解
- .NET设计模式(3):抽象工厂模式(Abstract Factory)
- 设计模式(4)-抽象工厂模式
- GOF23设计模式之抽象工厂模式的实现
- 设计模式(3)---->抽象工厂模式
- 23种设计模式之-----抽象工厂模式(AbstractFactory pattern)
- (转)设计模式(4):抽象工厂模式
- 设计模式(Design Patterns)-可复用面向对象软件的基础 02:工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory)
- IOS设计模式浅析之抽象工厂模式(Abstract Factory)
- 设计模式示例-抽象工厂模式
- 【设计模式】 抽象工厂模式(Abstract Factory)
- 设计模式之抽象工厂模式
- java设计模式——抽象工厂模式
- 设计模式学习:抽象工厂模式
- 简单理解设计模式之抽象工厂模式
- 设计模式之抽象工厂模式
- 设计模式 抽象工厂模式
- 设计模式之四:抽象工厂模式—产品族的创建
- Python设计模式(一)【抽象工厂模式】