1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #ifndef OBJECTFACTORY_H
#define OBJECTFACTORY_H
#include <QHash>
#include <QSharedDataPointer>
#include <QMutex>
#include <QMutexLocker>
template<typename T_ID, typename T_BASE>
class ObjectFactory : public QSharedData
{
typedef T_BASE* (ClassCreationFunc)();
typedef ObjectFactory<T_ID,T_BASE> factory;
static QHash<T_ID, ClassCreationFunc*> s_registry;
static QSharedDataPointer<ObjectFactory> s_instance;
static QMutex s_mutex;
public :
template<typename T_OBJECT>
static T_BASE* derivedClassCreationFunc()
{
T_OBJECT* t = new T_OBJECT;
T_BASE* c = dynamic_cast<T_BASE*>(t);
if (!c) delete t;
return c;
}
static inline bool registerObject(const T_ID& id, ClassCreationFunc* func)
{
typename QHash<T_ID, ClassCreationFunc*>::iterator it = s_registry.insert(id, func);
return(it != s_registry.end());
}
inline T_BASE* create(const T_ID& id)
{
T_BASE* obj = 0;
typename QHash<T_ID, ClassCreationFunc*>::iterator it = s_registry.find(id);
if (it != s_registry.end()) {
ClassCreationFunc* pFunc = it->second;
obj = pFunc();
}
return obj;
}
static QSharedDataPointer<ObjectFactory<T_ID, T_BASE> > getInstance()
{
if(!factory::s_instance) {
QMutexLocker locker(&factory::s_mutex);
if(!factory::s_instance) {
factory::s_instance = new ObjectFactory<T_ID,T_BASE>();
}
}
return ObjectFactory<T_ID, T_BASE>::s_instance;
}
#define FACTORY_REGISTER_CLASS(T_ID, T_Base, _id_, T_OBJECT) \
QSharedDataPointer<ObjectFactory<T_ID,T_Base> > _fac_ = ObjectFactory<T_ID,T_Base>::getInstance(); \
return _fac_->registerObject(_id_, ObjectFactory<T_ID, T_Base>::template derivedClassCreationFunc<T_OBJECT>);
};
#endif // OBJECTFACTORY_H |
Partager