64,648
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <afx.h>
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A()
{
cout<<"A class create !"<<endl;
}
};
class B
{
public:
B()
{
cout<<"B class create !"<<endl;
}
};
//
void* Create(string& classname)
{ //这里怎么实现?或者有更好解决方法?
void* pMyclass;
CRuntimeClass* pclass = RUNTIME_CLASS(classname);//这里报错。
pMyclass = pclass->CreateObject();
return pMyclass;
}
//工厂模式,缺点是如果增加另一个类C,必须修改工厂代码。
//目标是当添加一个新类时,不用修改原有代码,所以该方法弃而不用。
void* FactoryCreate(string &classname)
{
void* pMyClass = NULL;
if (classname == "A")
pMyClass = new A;
else if (classname == "B")
pMyClass = new B;
// else if (classname == "C") 新增加一个类C必须添加这一条件分支
// pMyClass = new C;
else
pMyClass = NULL;
return pMyClass;
}
int _tmain(int argc, _TCHAR* argv[])
{
string str;
cin>>str;
A *pA = (A*)Create(str);
delete pA;
cin>>str;
B *pB = (B*)Create(str);
delete pB;
system("pause");
return 0;
}
#include <map>
#include <iostream>
#include <string>
class factory
{
struct abs_generator
{
virtual ~abs_generator(){}
virtual void * constructor() = 0;
};
template<typename T>
struct generator: abs_generator
{
void * constructor()
{
return (new T());
}
};
struct obj_wrapper
{
obj_wrapper(abs_generator* ag)
: abs_gen_(ag)
{}
template<typename T>
operator T*()
{
return (dynamic_cast<generator<T>*>(abs_gen_) ?
reinterpret_cast<T*>(abs_gen_->constructor()) : 0);
}
private:
abs_generator * abs_gen_;
};
public:
~factory()
{
for(std::map<std::string, abs_generator*>::iterator i = genmap_.begin(); i != genmap_.end(); ++i)
{
delete i->second;
}
}
template<typename T>
void material(const std::string& str)
{
std::map<std::string, abs_generator*>::iterator i = genmap_.find(str);
if(i == genmap_.end())
genmap_[str] = new generator<T>;
}
obj_wrapper make(const std::string& str)
{
std::map<std::string, abs_generator*>::iterator i = genmap_.find(str);
return obj_wrapper(i != genmap_.end() ? i->second : 0);
}
private:
std::map<std::string, abs_generator*> genmap_;
};
int main()
{
factory f;
//首先设置可以创建类型
f.material<int>("int");
f.material<std::string>("string");
//创建
int * p = f.make("int");
std::string * str = f.make("string");
cout<<*p<<endl;
cout<<*str<<endl;
}