假设我有一个Image
类。在解析的某个时刻,会在适当的时间读取“Image”,这意味着我想创建一个Image
类的对象。
我正在考虑将这些字符串映射到适当的类的构造函数调用,但是我不确定如何完成此操作。
即
container.push_back( some_map[stringParsedIn] ); // basic idea
最佳答案
正如Stephen指出的,您所描述的是Factory模式(假设Image是一个抽象基类)。但是,对于其实现,将字符串与您所描述的创建函数相关联而不是由if / else语句组成的大型函数可能会有所帮助。这是一种实现方法(假设图像子类都可以以相同的方式构造):
typedef Image* create_image_function();
template <class T>
Image* create_image(SomeType arg)
{
return new T(arg);
}
...
map<string, create_image_function*> creators;
creators["Foo"] = &create_image<Foo>;
creators["Bar"] = &create_image<Bar>;
creators["Baz"] = &create_image<Baz>;
shared_ptr<Image> ImageFactory::make_image(const string& str)
{
// checking to see if str exists as a key
// would be nice
return shared_ptr<Image>(creators[str](arg));
}