配置由Factory构建的对象的正确模式

Correct pattern to configure objects built by Factory

本文关键字:模式 对象 配置 Factory 构建      更新时间:2023-10-16

过去几周我一直有这个问题。我目前的实现是可行的,但我很想知道是否有一个"好方法"来做到这一点。我不熟悉设计模式,所以这可能是一个愚蠢的问题。

简单地说,你有:

  • 提供接口的对象原型(我们称之为抽象内核);
  • 以各种方式实现上述接口的特定内核;
  • 一个具体的内核工厂;
  • 另一个对象Foo,存储一个指向抽象内核的指针,由Factory返回。

我的问题是:特定的内核实现可以定义自己的一组参数,这些参数因内核而异。Foo使用内核来做一些处理,但是这个处理最终取决于这些参数,我不知道如何以一种好的方式配置这些参数。

我不想去抽象工厂,并在构建之前配置具体工厂,因为这对我来说似乎是错误的;有参数的不是工厂,而是内核。

但另一方面,即使我在Foo中设置内核指针为公共,我也无法访问底层内核的参数,因为它们不是原型接口的一部分…我相信其他人以前也遇到过这个问题,也许有一个简单的解决方案我没有看到。: S

提前感谢!

注意:在我当前的实现中,没有内核工厂。我将内核具体类型作为Foo的模板,并将内核设置为public成员,这允许我在声明之后和开始处理之前配置内核。

如果一段代码知道它使用的具体内核类型,那么它应该有一个指向该具体内核类型的指针。如果没有,它就不能访问它的特定参数(但可以像@Jaywalker建议的那样以通用的方式访问所有参数)。

您当前的实现似乎走了第一条路线,这是完全可以的。

我对你的设计有非常有限的信息,但看起来你有几个具体的内核类型,每个类型一个单独的构建器,每个类型一个单独的配置器。将所有构建器打包到一个Factory中是有问题的,因为没有一种干净而优雅的方式将具体的内核类型转发给它们各自的配置器(没有*_cast<>或双调度之类的东西)。至少有两种方法可以解决这个问题,并且仍然有一个工厂:

  1. 将每个构建器与其各自的配置器捆绑在一起,并将所有捆绑包打包到一个工厂中,该工厂生产配置的内核。
  2. 将每个内核与其配置器捆绑在一起,并创建一个工厂来生成这些包(这样内核在其生命周期中可以被配置任意次数)。

如您所说,任何不属于原型界面一部分的内容都将无法在Foo中使用。如果Foo知道每个内核实现的细节,那么使用工厂模式就没有意义了。

在某些有限的情况下,在原型界面中添加如下getter和setter可以完成您的工作:

virtual bool setParameter (const string &key, const string &value) = 0;
virtual string getParameter (const string &key) = 0;