由于我无法使用真实代码,我将尝试使用简化的伪代码示例来描述情况:
class Factory {
public:
System& build(const Input& input) {
if (input.getType() == "Airplane") return Airplane(input.getNrWheels);
if (input.getType() == "Car") return Car(input.getNrWheels);
}
}
Car and Airplane都继承自System;
我们在两个可执行文件中使用此工厂。由于可执行文件1可以与汽车一起使用,而可执行文件2可以与飞机一起使用。 我们希望能够编译和链接工厂和汽车的可执行文件1和工厂和飞机的可执行文件2。我们应该如何使用Factory类来启用它?
编辑:评论/答案后改变
这是一个不那么简单的例子,更清楚地显示了我的问题:
class Factory {
public:
System& build(const Input& input) {
if (input.Airplane()) {
Pilot& pilot = *new Pilot();
AutoPilot& autoPilot = *new AutoPilot();
return Airplane(input.Airplane()->NrWheels(), pilot);
}
if (input.Car()) {
Driver& driver = *new Driver();
return Car(input.Car()->NrWheels, driver);
}
}
}
我喜欢下面的答案,它建议构造函数映射,但我(我想)我需要一个允许构造函数使用不同参数的版本。 我还想让Car和Airplane不依赖于Input。
答案 0 :(得分:1)
使用std::map<std::string, std::function<System(T)> ctorMap;
之类的内容,其中T
是Input::getNrWheels
的类型,在Factory
内保存适当的构造函数,由字符串索引。还提供了一个方法,比如Factory::Register(std::string, std::function<System(T))
,任何类都可以使用它来注册它的构造函数。因此,定义Airplane
的TU应该确保在静态初始化期间有一个调用,例如Factory::Register("Airplane", std::make_function(&Airplane::Airplane))
。
此外,Factory::build
现在看起来像这样:
System& build(const Input& input) {
return ctorMap[input.getType()](input.getNrWheels);
}
答案 1 :(得分:0)
完全切掉它。当它只能创造一种东西时,它几乎没有任何好处。只需使用typedef来灵活处理您正在创建的系统类型。