正确的模式,用于配置Factory构建的对象

时间:2013-01-09 16:27:22

标签: c++ design-patterns factory

过去几周我遇到了这个问题。我当前的实现工作,但我很想知道是否有一个“好方法”来做到这一点。我是设计模式的新手,所以这可能是一个愚蠢的问题。

简单地说,你有:

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

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

我不想去抽象工厂,在建造之前配置混凝土工厂,因为这对我来说似乎不对;它不是具有参数的工厂,而是内核。

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

提前致谢!

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

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

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