2

我想为线性程序求解编写一个库。因此使用了几个求解器,例如 cplex 或 gurobi。我已经拥有的是它们每个的接口(都包含将它们包装到求解器特定代码的相同函数)。

现在我想要一个类'LinearProgram',它可以通过LinearProgram("cplex")实例化,然后调用cplex求解器。

我的第一个想法是使用超类“求解器”,它是所有求解器接口的基类,包含作为虚拟声明的相应函数。但是后来我得到了一个无法实例化的抽象类。所以在 LinearProgram 我想要一个变量 Solver ,它根据构造函数中给出的字符串进行实例化。

我确信一个适当的解决方案是很明显的,但我现在所能想到的并不令人满意。

谢谢你的帮助。

4

2 回答 2

0

这说明了您的描述:

class Solver {
...abstract base
};

class SolverFactory {
public:
    Solver* NewSolverWithName(const std::string& pSolverName);
};

class LinearProgram {
public:
    LinearProgram(const std::string& pSolverName) :
      d_solver(SolverFactory::NewSolverWithName(pSolverName)) {
    }
private:
    some_auto_pointer<Solver> d_solver;
};

class cplex_Solver : public Solver {
...
    static std::string Name();
};

Solver* SolverFactory::NewSolverWithName(const std::string& pSolverName) {
    if (pSolverName == cplex_Solver::Name()) {
      return new cplex_Solver();
    }
    ...
}
于 2012-11-05T20:08:26.167 回答
0

这是两种不同设计模式相结合的工作。

第一个是信封字母模式,第二个是策略模式

继续使用您当前拥有的基类,并创建一个派生类,该派生类只是将调用转发到指向基类的嵌入式指针。派生类现在可以通过值自由传递。

基类还可以包含一个静态成员函数,该函数返回一个指向基类的指针。这个静态成员函数将允许您通过使用字符串名称来查找派生类来实例化它。这提供了一种在运行时选择算法的便捷方式。

但是知道他们想要哪个派生类(哪种策略)的人可以只用“new”创建一个并将其填充到信封类的实例中。

如果您决定只使用shared_ptr基类,则可以选择取消信封类。

于 2012-11-05T20:09:31.327 回答