84 lines
1.9 KiB
C++
84 lines
1.9 KiB
C++
/**
|
||
* @file ObjectGenralFactory.h
|
||
* @brief 通用的模板工厂类,支持任意数据类型作为key,value为创建任意基类的函数指针
|
||
* @date 2014-5-28
|
||
* @author: liyonggang
|
||
*/
|
||
#ifndef PAI_FRAME_OSGGENERALFACTORY_H
|
||
#define PAI_FRAME_OSGGENERALFACTORY_H
|
||
#pragma warning( push ,0)
|
||
#include <map>
|
||
#include "OSGDataModel.h"
|
||
#pragma warning( pop )
|
||
|
||
BEGIN_OSGDATAMODEL_NAMESPACE;
|
||
template <typename keyClassName,typename baseclassname>
|
||
class CObjectGenralFactory
|
||
{
|
||
public:
|
||
typedef baseclassname* (*pCreateObjectFunction)();
|
||
|
||
void Rigister( keyClassName key,pCreateObjectFunction func )
|
||
{
|
||
m_map[key] = func;
|
||
}
|
||
|
||
baseclassname* CreateObject(keyClassName key)
|
||
{
|
||
typename std::map< keyClassName,pCreateObjectFunction >::iterator it = m_map.find( key );
|
||
if ( it != m_map.end() )
|
||
{
|
||
return (it->second)();
|
||
}
|
||
return NULL;
|
||
}
|
||
bool IsSupport( keyClassName s )
|
||
{
|
||
return m_map.find( s ) != m_map.end();
|
||
}
|
||
std::map< keyClassName,pCreateObjectFunction > m_map;
|
||
};
|
||
|
||
template <typename keyClassName,typename baseclassname>
|
||
class CObjectGenralFactoryAuto
|
||
{
|
||
public:
|
||
typedef baseclassname* (*pCreateObjectFunction)();
|
||
|
||
CObjectGenralFactoryAuto( keyClassName* keyArr,pCreateObjectFunction func )
|
||
{
|
||
keyClassName defaultKey;
|
||
for( long i = 0;;i++)
|
||
{
|
||
if( keyArr[i] != defaultKey )
|
||
{
|
||
baseclassname::GetFatory().Rigister( keyArr[i],func );
|
||
}else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
#define BEGIN_REGISTER(keyClassName,baseclassname,className)\
|
||
baseclassname *Create##className()\
|
||
{\
|
||
return new className() ;\
|
||
}\
|
||
keyClassName g_##className##RegPairs[]={\
|
||
|
||
|
||
#define END_REGISTER(keyClassName,baseclassname,className)\
|
||
,keyClassName() };\
|
||
datamodel::CObjectGenralFactoryAuto<keyClassName,baseclassname> g_##className##GeneralRegister(g_##className##RegPairs,Create##className);
|
||
|
||
|
||
OSGDATAMODEL_EXPORT QStringList LoadAllPlugin(const QString &PluginTypeName);
|
||
|
||
|
||
END_OSGDATAMODEL_NAMESPACE
|
||
|
||
#endif
|