一个C++实现类似反射的工厂模式
Posted on 周三 19 四月 2017 in 编程语言
@(编程语言)[C/C++]
目的:使用C++实现一个有类似反射功能的工厂类
头文件:
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Base
{
public:
virtual void print() {cout << "this is class Base" << endl;}
};
class DeriveA : public Base
{
public:
virtual void print() {cout << "this is class DeriveA" << endl;}
};
class DeriveB : public Base
{
public:
virtual void print() {cout << "this is class DeriveB" << endl;}
};
class Factory
{
public:
static Factory * shareInstance();
~Factory();
template<typename T>
T* getClass()
{
string keyName = string(typeid(T).name());
map<string, Base*>::iterator iter = mClassMap.find(keyName);
if (iter != mClassMap.end())
{
T * retObj = dynamic_cast<T*>(iter->second);
if (retObj)
{
return retObj;
}
}
T* retObj = new T();
addClass(keyName, retObj);
return retObj;
}
private:
Factory();
void addClass(const string & key, Base * baseClass);
private:
map<string, Base*> mClassMap;
};
源文件
Factory::Factory(){}
Factory::~Factory(){}
Factory * Factory::shareInstance()
{
static Factory factory;
return &factory;
}
void Factory::addClass(const string & key, Base * baseClass)
{
map<string, Base*>::iterator iter = mClassMap.find(key);
if (iter != mClassMap.end())
{
delete (iter->second);
mClassMap.erase(iter);
}
mClassMap[key] = baseClass;
}
int main(int argc, char ** argv)
{
Factory::shareInstance()->getClass<DeriveA>()->print();
Factory::shareInstance()->getClass<DeriveB>()->print();
return 0;
}