/**
* @file ClassFactory.h
* @brief
* @author LMS
* @date 4/2/2015
* ------------------------------------------------------------
* 版本历史 注释 日期
* ------------------------------------------------------------
* @version v1.0 初始版本 4/2/2015
* ------------------------------------------------------------
* Note:
*/
#pragma once
#ifndef _MAP_
#include <map>
#endif
#define CREATER static
/**
* @class SubClassRegister
* @brief 子类注册类
* @param SUB_CLASS_MARK - 子类标识符类型
* @param SUB_CLASS_CREATER - 子类创建函数类型
* @author LMS
* @date 4/2/2015
* ------------------------------------------------------------
* 版本历史 注释 日期
* ------------------------------------------------------------
* @version v1.0 初始版本 4/2/2015
* ------------------------------------------------------------
* Note:
*/
template<typename SUB_CLASS_MARK, typename SUB_CLASS_CREATER>
class SubClassRegisterProcess
{
//__declareSubClass的函数原型
typedef SUB_CLASS_CREATER (*PFN_DECLARER)(SUB_CLASS_MARK, SUB_CLASS_CREATER);
public:
/**
* @brief 在构造函数中注册子类
* @param subClassMark - 子类标识符值
* @param declarer - 基类的注册函数
* @param subClassCreater - 子类创建函数
*/
SubClassRegisterProcess(SUB_CLASS_MARK subClassMark, PFN_DECLARER declarer, SUB_CLASS_CREATER subClassCreater)
{ declarer(subClassMark, subClassCreater); }
};
//声明此基类派生的所有子类都可以由它创建
//SUB_CLASS_MARK - 子类标识符类型
//SUB_CLASS_CREATER - 子类创建方法
#define DECLARE_BASE_CLASS(SUB_CLASS_MARK, SUB_CLASS_CREATER) \
static SUB_CLASS_CREATER __declareSubClass(SUB_CLASS_MARK subClassMark, SUB_CLASS_CREATER subClassCreater=NULL) \
{ static std::map<SUB_CLASS_MARK, SUB_CLASS_CREATER> __mapCreater; \
if (NULL != subClassCreater) __mapCreater[subClassMark] = subClassCreater; \
return __mapCreater[subClassMark]; }
//声明此子类可由其基类创建
//BASE_CLASS - 基类类型
//SUB_CLASS - 子类类型
//SUB_CLASS_MARK - 子类标识类型
//subClassMark - 子类标识值
//SUB_CLASS_CREATER - 子类创建方法类型
//subClassCreater - 子类创建方法
#define DECLARE_SUB_CLASS(BASE_CLASS, SUB_CLASS, SUB_CLASS_MARK, subClassMark, SUB_CLASS_CREATER, subClassCreater) \
SubClassRegisterProcess<SUB_CLASS_MARK, SUB_CLASS_CREATER> \
__register_ ## SUB_CLASS ## (subClassMark, BASE_CLASS::__declareSubClass, subClassCreater)
//获得子类的创建方法
//subClassMark - 子类标识值
#define GET_SUB_CLASS_CREATER(subClassMark) \
__declareSubClass(subClassMark)
//example:
/base.h/
/*
//creater 原型 参数为构造函数的参数
typedef void *(*PFN_SUB_CLASS_CREATER)(int nParam);
class base
{
public:
base(int nParam)
{
//...
}
CREATER base *New(std::string sType, int nParam)
{
PFN_SUB_CLASS_CREATER pfnCreater = GET_SUB_CLASS_CREATER(sType);
if (NULL != pfnCreater)
return (base *)pfnCreater(nParam);
return NULL;
}
DECLARE_BASE_CLASS(std::string, PFN_SUB_CLASS_CREATER);
};
*/
/
//
/derive.h
/*
#include "base.h"
class derive
: public base
{
public:
derive(int nParam)
: base(nParam)
{
//...
}
CREATER void *__creater(int nParam)
{
return new derive(nParam);
}
};
*/
//
derive.cpp//
/*
DECLARE_SUB_CLASS(base, derive, std::string, "aaaa", PFN_SUB_CLASS_CREATER, derive::__creater);
*/
///调用/
/*
#include "base.h"
void main()
{
base *pBase = base::New("aaaa", 1);
}
*/
主要思想:把子类实例化放到静态函数中,然后把此静态函数的地址存起来供按需调用。而调用子类实例化函数的正是其基类的一个实例化静态函数。
在默认构造函数下的类工厂:
/**
* @file ClassFactoryDefaultConstruct.h
* @brief 默让构造函数下的类实例
* @author LMS
* @date 10/4/2015
* ------------------------------------------------------------
* 版本历史 注释 日期
* ------------------------------------------------------------
* @version v1.0 初始版本 10/4/2015
* ------------------------------------------------------------
* Note:
*/
#pragma once
#include "ClassFactory.h"
typedef void *(*PFN_SUB_CLASS_CREATER)();
//声明基类(在基类的h文件中声明)
// SUB_CLASS_MARK - 子类标识类型(如:std::string)
#define DECLARE_BASE_CLASS_WITH_DEFAULT_CONSTRUCT(SUB_CLASS_MARK) \
CREATER void *New(SUB_CLASS_MARK nMark) { \
PFN_SUB_CLASS_CREATER pfnCreater = GET_SUB_CLASS_CREATER(nMark); \
if (NULL != pfnCreater) return (void *)pfnCreater(); \
return NULL; } \
DECLARE_BASE_CLASS(SUB_CLASS_MARK, PFN_SUB_CLASS_CREATER)
//声明子类(在子类的cpp中声明)
// BASE_CLASS - 基类
// SUB_CLASS - 子类
// SUB_CLASS_MARK - 子类标识类型(与DECLARE_BASE_CLASS_WITH_DEFAULT_CONSTRUCT中的一样)
// subClassMark - 子类标识
#define DECLARE_SUB_CLASS_WITH_DEFAULT_CONSTRUCT(BASE_CLASS, SUB_CLASS, SUB_CLASS_MARK, subClassMark) \
void *__New_ ## SUB_CLASS ## (){ return new SUB_CLASS(); } \
DECLARE_SUB_CLASS(BASE_CLASS, SUB_CLASS, SUB_CLASS_MARK, subClassMark, PFN_SUB_CLASS_CREATER, __New_ ## SUB_CLASS)