/** * @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 #include "OSGDataModel.h" #pragma warning( pop ) BEGIN_OSGDATAMODEL_NAMESPACE; template 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 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 g_##className##GeneralRegister(g_##className##RegPairs,Create##className); OSGDATAMODEL_EXPORT QStringList LoadAllPlugin(const QString &PluginTypeName); END_OSGDATAMODEL_NAMESPACE #endif