C++动态创建及工厂模式的模拟

#ifndef _FS_H
#define _FS_H
#pragma once
#include <string>
#include <map>
#include <iostream>


using namespace std;


typedef void* (*CreateClass)(void);


/*@类工厂,通过一个MAP成员来实现类名与类的实例化对象函数的映射
* @向外部提供一个接口函数,通过类名来创建该类对象
* @MAP是静态的,这样可以在程序运行前就可以存在
*/
class ClassFactory
{
public:
static void* GetClassByName(string className)
{
map<string,CreateClass>::const_iterator iter;
iter = m_classMap.find(className);
if(iter==m_classMap.end())
return NULL;
else
return iter->second();
}


static void RegistClass(string name,CreateClass method)
{
m_classMap.insert(pair<string,CreateClass>(name,method));
}


private:
static map<string,CreateClass> m_classMap;
};


map<string,CreateClass> ClassFactory::m_classMap;




/*@动态创建类,动态创建的类通过包含该类的一个静态对象
*向类工厂里注册自己的创建对象函数
*/
class GenDynamic
{
public:
GenDynamic(string name,CreateClass method)
{
ClassFactory::RegistClass(name,method);
}
};


/*@定义宏,类通过包含该宏,实现动态创建*/
#define DECLARE_RUNTIME(class_name)\
string class_name##Name;\
static GenDynamic* class_name##gd


/*@宏实现,类通过实现该宏,实现动态创建*/
#define IMPLEMENT_RUNTIME(class_name)\
GenDynamic* class_name::class_name##gd\
= new GenDynamic(#class_name,class_name::CreateInstance);


/*@顶层父类*/
class CObject
{
private:
DECLARE_RUNTIME(CObject);
public:
CObject()
{

}
static void* CreateInstance()
{
return new CObject;
}
virtual void display()
{
cout<<"CObject display()"<<endl;
}
};
IMPLEMENT_RUNTIME(CObject)


/*@一个子类*/
class Csun:public CObject
{
private:
DECLARE_RUNTIME(Csun);
public:
Csun()
{

}
static void* CreateInstance()
{
return new Csun;
}
virtual void display()
{
cout<<"Csun display()"<<endl;
}
};
IMPLEMENT_RUNTIME(Csun)

#endif


测试程序:

#include "H1.h"
class Ctest:public CObject
{
private:
DECLARE_RUNTIME(Ctest);
public:
Csun()
{

}
static void* CreateInstance()
{
return new Ctest;
}
virtual void display()
{
cout<<"Ctest display()"<<endl;
}
};


IMPLEMENT_RUNTIME(Ctest)
void main()
{
CObject* p = (CObject*)ClassFactory::GetClassByName("Ctest");
p->display();
return;
}


要使创建的类支持动态创建,只要加入自定义的2个宏,便会向工厂类注册,工厂类便可产生该对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值