在盖莫游戏引擎的书写过程中先后书写了资源管理器,场景管理器,模型管理器等管理器类.之后感觉很有必要写一个泛型的管理器类了.这个可以少做一些重复性的工作了。
管理器类无非就是获取当前对象个数,对象生成,对象按名索取等等
经过考虑,草料书写如下:
1 namespace core
2 {
3
4 ////////////////////////////////////////////////////////////
5 //! 定义引擎泛型管理器类
6 ////////////////////////////////////////////////////////////
7 template<class Obj = Object, class Type = std::string>
8 class Manager
9 {
10 public:
11 typedef Type ThisType;
12 typedef Obj ThisObj;
13 typedef std::map<ThisType,RefPtr<ThisObj> > Table;
14 //! typedef std::map<ThisType,RefPtr<ThisObj> >::iterator TableItr;
15
16 ////////////////////////////////////////////////////////
17 //! 构造,析构场景管理器
18 ////////////////////////////////////////////////////////
19 Manager(){}
20 virtual ~Manager() = 0;
21 public:
22
23 ////////////////////////////////////////////////////////////
24 /// 获取当前管理器中的对象个数
25 ////////////////////////////////////////////////////////////
26 inline uint32 GetObjectNumber()const{return objects.size();}
27
28 ////////////////////////////////////////////////////////////
29 /// 检测当前管理器中是否存在对象
30 ////////////////////////////////////////////////////////////
31 inline bool HasObject()const{return !objects.empty();}
32
33 ////////////////////////////////////////////////////////////
34 /// 获取给定索引的对象(如果对象不存在则生成一个新的对象)
35 ////////////////////////////////////////////////////////////
36 inline RefPtr<Object> GetObject(const Type& name)
37 {
38 if(objects.find(name) != objects.end())
39 return objects[name];
40 return NULL;
41 }
42
43 ////////////////////////////////////////////////////////////
44 /// 生成一个新的对象
45 ////////////////////////////////////////////////////////////
46 virtual RefPtr<ThisObj> CreateObject(const Type& name) = 0;
47
48 ////////////////////////////////////////////////////////////
49 /// 销毁指定名字的对象
50 ////////////////////////////////////////////////////////////
51 inline bool KillObject(const Type& name)
52 {
53 std::map<std::string,RefPtr<Model> >::iterator itr = objects.find(name);
54 if(itr == objects.end())
55 return false;
56 objects.erase(name);
57 return NULL;
58 }
59
60 ////////////////////////////////////////////////////////////
61 /// 管理器对象清空
62 ////////////////////////////////////////////////////////////
63 inline void ClearObject(){objects.clear();}
64 protected:
65 Table objects;
66 };
67
68 template<class Obj, class Type>
69 Manager<Obj,Type>::~Manager()
70 {
71 ClearObject();
72 }
73
其中使用std::map作为基本的管理器容器
同时其中CreateObject函数是一个虚拟函数需要重载之
然后我们就可以这样写具体的的管理器了.
比如:
1 class ModelManager : public Manager<Model,std::string>
2 {
3 public:
4 RefPtr<Model> CreateObject(const std::string &);
5 };