本文在GOF《设计模式》一书“创建型模式”一章的例子和模式的基础上,将各个创建型模式有机的结合在一起。实现了“迷宫”构造过程的封装,增强了构造不同迷宫的可扩展性。
创建型模式:
抽象工厂
工厂方法
生成器
原型
单件
其中,抽象工厂是由工厂方法组成的,是一组相互关联的工厂方法的集合。
“迷宫”构造类图:
从类图中可以看出各个模式直接的关系,同时为了显示构造好的迷宫图案,还使用了“策略模式”用于画出迷宫(图中的MazeDrawer类层次)。
以下是各个模块的C++实现:
- #ifndef _PART_H_
- #define _PART_H_
- //Part.h
- enum Direction
- {
- East,
- South,
- West,
- North
- };
- class MapSite
- {
- public:
- virtual void Enter() = 0;
- virtual char* GetInfo() = 0;
- };
- class Room:public MapSite
- {
- public:
- Room(int roomNo)
- {
- _roomNo = roomNo;
- for(int i=0; i<4; ++i)
- _sides[i] = 0;
- }
- MapSite* GetSide(Direction d) const
- {
- return _sides[d];
- }
- void SetSide(Direction d, MapSite* ms)
- {
- if(_sides[d] != 0)
- delete _sides[d];
- _sides[d] = ms;
- }
- virtual void Enter()
- {
- }
- virtual char* GetInfo()
- {
- return "Room";
- }
- int RoomNo() const
- {
- return _roomNo;
- }
- private:
- MapSite* _sides[4];
- int _roomNo;
- };
- class Wall:public MapSite
- {
- public:
- Wall()
- {
- }
- virtual void Enter()
- {
- }
- virtual char* GetInfo()
- {
- return "Wall";
- }
- };
- class Door:public MapSite
- {
- public:
- Door(Room* r1 = 0, Room* r2 = 0)
- {
- _room1 = r1;
- _room2 = r2;
- _isOpen = false;
- }
- Room* OtherSideFrom(Room* r)
- {
- if(r == _room1)
- return _room2;
- else if(r == _room2)
- return _room1;
- return 0;
- }
- virtual void Enter()
- {
- }
- virtual char* GetInfo()
- {
- return "Door";
- }
- private:
- Room* _room1;
- Room* _room2;
- bool _isOpen;
- };
- class Spell
- {
- public:
- Spell()
- {}
- };
- class EnchantedRoom: public Room
- {
- public:
- EnchantedRoo