假设我有一个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));
}

07-25 20:34