-
例子--迷宫
假定我们现在来实现一个迷宫,迷宫由一个个房间组成,而房间之间由墙和 门来连接。所以迷宫就有几个基础组件:房间,门,墙。假设他们都有一个共同的动作,进入(无论能否进入)。class MapSite { public: virtual void enter() = 0; }; enum Direction { North, South, East, West }; // 房子4边 class Room : public MapSite { public: Room(int roomNo) { } vois setSide(Direction, MapSite*) { } // 设置房子4边。 virtual void enter() { } private: MapSite* _sides[4]; // 房子四边由墙或者门组成。 int _roomNo; }; class Wall:public MapSite { public: Wall() { } virtual void enter() { } }; class Door { public: Door(Room* , Room*) { } virtual enter() { } private: Room* _room1; Room* _room2; bool _isOpen; };
而迷宫本身就可以看成是一系列房间的集合。
class Maze { public: Maze() { } void AddRoom(Room*) { } Room* RoomNo(int) const; private: // 或用线性表,hash表,树存储一系列房间。 };
现在来定义一个类MazeGame,由它来创建迷宫
class MazeGame { public: Maze* CreateMaze(); private: Maze* aMaze; }; Maze* MazeGame::CreateMaze() { Maze* aMaze = new Maze(); Room* r1 = new Room(1); Room* r2 = new Room(2); Door* theDoor = new Door(r1, r2); aMaze->addRoom(r1); aMaze->addRoom(r2); r1->setSide(North, new Wall()); ...... return aMaze; }
这个函数的问题是在于它缺乏可扩展性,假设现在要增加一种新的游戏迷宫,施了魔法的迷宫,新增加2个组件,EnchantedRoom和NeedSpellDoor。需要咒语或者钥匙才能打开的门,和有宝物的房间(咒语,钥匙)。那么在MazeGame中是不是得另外新建一个函数CreateMagicMaze()?那假如我以后要新增n个新的游戏迷宫呢?
-
抽象工厂模式
试试这样写代码:
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); } }; class EnchantedMazeFactory : public MazeFactory { public: EnchantedMazeFactory(); virtual Room* makeRoom(int n) const { return new EnchantedRoom(n, CastSpell()); } virtual Door* makeDoor(Room* r1, Room* r2) const { return new NeedSpellDoor(r1, r2); } }; Maze* MazeGame::CreateMaze(MazeFactory& factory) { Maze* aMaze = new Maze(); Room* r1 = factory.makeRoom(1); Room* r2 = factory.makeRoom(2); Door* theDoor = factory.makeDoor(r1, r2); aMaze->addRoom(r1); aMaze->addRoom(r2); r1->setSide(North, factory.makeWall()); ...... return aMaze; }
创建型模式---抽象工厂模式
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1 场景问题# 1.1 选择组装电脑的配件## 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选...
- 23种设计模式 “对象性能”模式 面向对象很好的解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况...