如何在工厂中为延迟实例化指定具体类/如何推迟构造函数调用

时间:2014-01-29 05:15:06

标签: c++ oop constructor

我有几个服务器程序,它们有一堆公共代码,但在一些子类实现方面有所不同。我使用类似于抽象工厂的模式:

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)

我的工厂实例化时没有这些值。

我需要以某种方式创建一个指向我想要的具体类的指针,将该指针存储在我的工厂中,以及 - 我无法弄清楚的难点 - 在数据最终到达时实例化(调用构造函数)这些类。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

有了这些限制,您的Program1Bar类不能成为第三方库的子类。很难说抽象,但有一个建议是你定义一个像Task1Bar这样的类,它是你的第三方库的子类。

然后在ProgramBar1::someMethod内某处,您可以拨打new Task1Bar。如果您需要第三方库保持跨方法,您可以随时在Task1Bar* task1课程中定义成员Program1Bar

只是一个建议,正如我所说,难以在摘要中定义。