0

在过去的几周里,这个问题一直困扰着我。我目前的实现有效,但我很想知道是否有“好方法”来做到这一点。我是设计模式的新手,所以这可能是一个愚蠢的问题。

简单地说,你有:

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

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

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

但另一方面,即使我将 Foo 中的内核指针设置为 public,我也无法访问底层内核的参数,因为它们不是原型接口的一部分......我敢肯定其他人有这个之前的问题,也许有一个我看不到的简单解决方案。:S

提前致谢!

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

4

2 回答 2

1

Foo正如您所说,不属于原型界面的任何内容都将不可用。Foo如果知道每个内核实现的细节,那么使用工厂模式根本没有意义。

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

virtual bool setParameter (const string &key, const string &value) = 0;
virtual string getParameter (const string &key) = 0;
于 2013-01-09T16:43:48.120 回答
1

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

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

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

  1. 将每个构建器与其各自的配置器捆绑在一起,并将所有捆绑包打包到一个工厂中,该工厂生产配置的内核。
  2. 将每个内核与其配置器捆绑在一起,并创建一个生产这些捆绑包的工厂(这样一个内核可以在其生命周期内配置任意次数)。
于 2013-01-09T17:13:34.623 回答