C++动态创建及工厂模式的模拟
2012-02-20 22:41
246 查看
#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个宏,便会向工厂类注册,工厂类便可产生该对象。
#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个宏,便会向工厂类注册,工厂类便可产生该对象。
相关文章推荐
- 从零开始学C++之模板(四):用模板实现单例模式、模板方式实现动态创建对象
- MFC 类的动态创建(类似于工厂模式)
- 模拟动态工厂 -----工厂模式
- 简单工厂模式和动态创建对象
- 从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象
- 自己在项目中的学习总结:利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口
- C++ 类工厂实现动态对象创建
- (设计模式)简单工厂模式之通过配置文件动态创建实现类
- C++模拟反射实现工厂模式
- JS面向对象的几种创建方式:工厂模式、构造函数模式、原型模式、混合模式、动态原型模式
- 软件开发模式之工厂模式模拟魔兽英雄创建(Darren)
- C++设计模式之动态创建
- 从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象
- C++ 宏定义动态加载、工厂模式
- 模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)zz
- C/C++动态内存创建与内存管理
- C++设计模式新解二 建造者模式+工厂模式
- <C/C++ 版> 设计模式 学习之 策略模式+工厂模式
- 简单工厂设计模式C++实现