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
|