我有几个服务器程序,它们有一堆通用代码,但在一些子类实现上有所不同。我使用像这样的抽象工厂模式:
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)
我的工厂实例化时没有这些值。
我需要以某种方式创建一个指向我想要的具体类的指针,将该指针存储在我的工厂中,并且——我无法弄清楚的困难部分——在数据最终到达时为这些类实例化(调用构造函数)。
我该怎么做?
最佳答案
由于这些限制,您的 Program1Bar
类不能是第 3 方库的子类。很难谈论抽象,但一个建议是让你定义一个像 Task1Bar
这样的类,它是你的第 3 方库的子类。
然后在 ProgramBar1::someMethod
中的某处,您可以调用 new Task1Bar
。如果您需要第 3 方库跨方法持久化,您始终可以在 Program1Bar
类中定义一个成员 Task1Bar* task1
。
只是一个建议,正如我所说,很难在抽象中定义。
关于c++ - 如何在工厂中为延迟实例化指定具体类/如何延迟构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21422677/