在多个库上拆分工厂(模式)

时间:2015-01-28 21:33:12

标签: c++

由于我无法使用真实代码,我将尝试使用简化的伪代码示例来描述情况:

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。

2 个答案:

答案 0 :(得分:1)

使用std::map<std::string, std::function<System(T)> ctorMap;之类的内容,其中TInput::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来灵活处理您正在创建的系统类型。