我正在考虑使用工厂函数在同一层次结构中创建不同的类。我了解通常工厂通常按如下方式实现:
Person* Person::Create(string type, ...)
{
// Student, Secretary and Professor are all derived classes of Person
if ( type == "student" ) return new Student(...);
if ( type == "secretary" ) return new Secretary(...);
if ( type == "professor" ) return new Professor(...);
return NULL;
}
我正在想办法让这个过程可以自动化,这样各种条件就不需要硬编码了。
到目前为止,我能想到的唯一方法是使用 map 和原型(prototype)模式:
映射将在第一个元素中保存类型字符串,在第二个元素中保存类实例(原型(prototype)):
std::map<string, Person> PersonClassMap;
// This may be do-able from a configuration file, I am not sure
PersonClassMap.insert(make_pair("student", Student(...)));
PersonClassMap.insert(make_pair("secondary", Secretary(...)));
PersonClassMap.insert(make_pair("professor", Professor(...)));
函数可能看起来像这样:
Person* Person::Create(string type)
{
map<string, Person>::iterator it = PersonClassMap.find(type) ;
if( it != PersonClassMap.end() )
{
return new Person(it->second); // Use copy constructor to create a new class instance from the prototype.
}
}
不幸的是,原型(prototype)方法只有在您只希望工厂创建的类每次都相同时才有效,因为它不支持参数。
有谁知道是否可以用一种好的方式来做,或者我是否坚持使用工厂函数?
当客户提供一些关于要创建的对象的信息,但他们不知道结果是什么具体类时,我通常会构建一个工厂方法(或工厂对象)。如何向工厂表达接口(interface)的决定完全取决于客户有什么信息。可能是它们提供了一个字符串(例如,要解析的程序文本)或一组参数值(如果我们在 n 空间中创建几何对象,则为维数和大小)。工厂方法然后检查信息并决定创建哪种对象或调用哪个更具体的工厂。
所以构建什么的决定不应该由调用者做出;如果她知道,那么工厂就没有理由了。如果要构建的事物列表是开放式的,您甚至可能有一个注册协议(protocol),允许特定实现提供它们的构造方法和一个鉴别器函数,允许工厂方法决定调用哪个方法。
这在很大程度上取决于决定构建哪种对象所需和充分的信息。
我是一名优秀的程序员,十分优秀!