我有几个服务器程序,它们有一堆公共代码,但在一些子类实现方面有所不同。我使用类似于抽象工厂的模式:
int main(int argc, char **argv) {
Factory *factory = new Program1Factory();
ServerThread theServer(factory); // inject the dependencies
theServer.start();
}
Factory是一个纯抽象类,由我需要获取方法的各个位组成,这些方法必须随程序而变化。看起来大致如下:
class Factory {
public: virtual foo *getFooThing() = 0;
public: virtual bar *getBarThing() = 0;
};
一个程序的具体声明和实现可能如下所示:
class Program1Factory : public Factory {
public: virtual foo *getFooThing() { return new Program1Foo(); }
public: virtual bar *getBarThing() { return new Program1Bar(); }
};
这很好用,直到我得到了一堆方法,这些方法本身就是我无法控制的库的子类。
在该库中,每个类的构造函数都要求在构造函数中提供要处理的数据!但是我的程序还没有数据;它刚刚启动并宣布其工厂。只有在设置了所有方法并且线程启动后,我的服务器程序才会接收作为构造函数输入的事务。
也就是说,在上面的例子中,我不能简单地说:
return new Program1Bar()
因为派生Program1Bar的类只有一个看起来像
的构造函数Program1Bar(string *inputString, string *outputString)
我的工厂实例化时没有这些值。
我需要以某种方式创建一个指向我想要的具体类的指针,将该指针存储在我的工厂中,以及 - 我无法弄清楚的难点 - 在数据最终到达时实例化(调用构造函数)这些类。
我该如何解决这个问题?
答案 0 :(得分:1)
有了这些限制,您的Program1Bar
类不能成为第三方库的子类。很难说抽象,但有一个建议是你定义一个像Task1Bar
这样的类,它是你的第三方库的子类。
然后在ProgramBar1::someMethod
内某处,您可以拨打new Task1Bar
。如果您需要第三方库保持跨方法,您可以随时在Task1Bar* task1
课程中定义成员Program1Bar
。
只是一个建议,正如我所说,难以在摘要中定义。