子类创建的类似工厂模式

27 篇文章 0 订阅
/** 
 * @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)

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值