您的位置:首页 > 编程语言 > C语言/C++

C++ 中泛型工厂注册类的实现

2004-11-18 12:59 1071 查看
//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: