//C++ 中泛型工厂注册类的实现
//---------------------------------------------------------------------------
#ifndef GenericFactoryH
#define GenericFactoryH
#include <string>
#include <map>
#define REGISTER_CLASS(BASE_CLASS, DERIVED_CLASS)\
RegisterInpFactory<BASE_CLASS, DERIVED_CLASS> Register##DERIVED_CLASS(#DERIVED_CLASS)
#define CREATE_CLASS(BASE_CLASS,DERIVED_CLASS)\
GenericFactory<BASE_CLASS>::instance().Create(#DERIVED_CLASS)
//---------------------------------------------------------------------------
using std::string;
using std::map;
template <class ManufacturedType, typename ClassIDKey=std::string>
class GenericFactory
{
typedef ManufacturedType* (*BaseCreateFn)();
typedef std::map<ClassIDKey, BaseCreateFn> FnRegistry;
FnRegistry registry;
GenericFactory() {}
GenericFactory(const GenericFactory&) {} // 没有实现
GenericFactory &operator=(const GenericFactory&) {} // 没有实现
public:
static GenericFactory& instance()
{
static GenericFactory<ManufacturedType,ClassIDKey> bf;
return bf;
}
void RegCreateFn(const ClassIDKey &classname, BaseCreateFn fn)
{
registry[classname] = fn;
}
ManufacturedType* Create(const ClassIDKey &classname) const
{
ManufacturedType* theObject(0);
FnRegistry::const_iterator regEntry = registry.find(classname);
if (regEntry != registry.end())
{
theObject = regEntry->second();
}
return theObject;
}
};
template <class AncestorType, class ManufacturedType, typename ClassIDKey=std::string>
class RegisterInpFactory
{
public:
static AncestorType* CreateInstance()
{
return (new ManufacturedType);
}
RegisterInpFactory(const ClassIDKey &id)
{
GenericFactory<AncestorType,ClassIDKey>::instance().RegCreateFn(id, CreateInstance);
}
};
#endif
本文地址:http://com.8s8s.com/it/it25300.htm