【问题标题】:Correct pattern to configure objects built by Factory正确的模式来配置工厂构建的对象
【发布时间】:2013-01-09 16:27:22
【问题描述】:

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

简单地说,你有:

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

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

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

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

提前致谢!

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

【问题讨论】:

    标签: c++ design-patterns factory


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在这种情况下,按照您的 cmets 和 Jaywalker 的做法,我认为采用通用解决方案会混淆代码而不是使其更清晰,因为到目前为止我只有一些具体的内核实现,而且它是预计不会变得更大。不过,关于您的帖子和 Jaywalk 的一条评论; Foo 不需要知道内核的参数,只需要知道原型的接口——但内核确实需要预先配置。
    • 如果Foo 不需要知道这些参数,内核不能从其他地方“读取”配置吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢你的回答,这就是我害怕的。虚拟键值设置器/获取器的主要问题是,为了解释任何类型的参数,实现起来很麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多