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
//---------------------------------------------------------------------------
#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
相关文章推荐
- g++ 编译 c++ 程序时需要包括 include .h 文件,还是需要 .cpp 文件
- 指针的概念
- C++ Primer学习笔记-第七章杂记
- C++语言风格流变史
- Effective C++ 2e: 内存管理
- 用WINSOCK实现聊天室的VC++程序设计
- C++运算符的体会
- C语言:陷阱和缺陷
- C++字符串完全指南 - MFC类
- C++字符串完全指南 - Win32字符编码(一)
- C++字符串完全指南 - Win32字符编码(二)
- C++中的动态多维数组
- 定义函数对象
- 由C++转向C#:我们需要注意哪些方面的变化?
- 对C++片断的回顾
- Visual Studio 2005 Express Beta Products 下载链接
- 编译器stack操作
- 利用seh进行错误处理(转)
- C++ Primer学习笔记-vc7.1 cl 编译选项
- 书籍大收藏