00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef factoryH
00022 #define factoryH
00023
00024
00025 #include <map>
00026 #include "messaginghub.h"
00027
00028 template<class Base, class Derived>
00029 Base* ObjectCreator()
00030 {
00031 return new Derived;
00032 }
00033
00034
00035 template < class AbstractProduct,
00036 typename IdentifierType >
00037 class Factory{
00038 public:
00039 typedef AbstractProduct* (*ObjectCreatorCallBack)();
00040 private:
00041 typedef std::map<IdentifierType, ObjectCreatorCallBack> CallbackMap;
00042 CallbackMap callbackMap;
00043 public:
00044 bool registerClass( IdentifierType id, ObjectCreatorCallBack createFn ) { callbackMap[id] = createFn; return true; };
00045 AbstractProduct* createObject( IdentifierType id )
00046 {
00047 typename CallbackMap::const_iterator i = callbackMap.find(id);
00048 if ( i != callbackMap.end() )
00049 return (i->second)();
00050 else {
00051 fatalError("Factory: Object ID not found");
00052 return NULL;
00053 }
00054 };
00055 };
00056
00057
00058 #endif