配置由Factory构建的对象的正确模式
Correct pattern to configure objects built by Factory
过去几周我一直有这个问题。我目前的实现是可行的,但我很想知道是否有一个"好方法"来做到这一点。我不熟悉设计模式,所以这可能是一个愚蠢的问题。
简单地说,你有:
- 提供接口的对象原型(我们称之为抽象内核);
- 以各种方式实现上述接口的特定内核; 一个具体的内核工厂;
- 另一个对象Foo,存储一个指向抽象内核的指针,由Factory返回。
我的问题是:特定的内核实现可以定义自己的一组参数,这些参数因内核而异。Foo使用内核来做一些处理,但是这个处理最终取决于这些参数,我不知道如何以一种好的方式配置这些参数。
我不想去抽象工厂,并在构建之前配置具体工厂,因为这对我来说似乎是错误的;有参数的不是工厂,而是内核。
但另一方面,即使我在Foo中设置内核指针为公共,我也无法访问底层内核的参数,因为它们不是原型接口的一部分…我相信其他人以前也遇到过这个问题,也许有一个简单的解决方案我没有看到。: S
提前感谢!
注意:在我当前的实现中,没有内核工厂。我将内核具体类型作为Foo的模板,并将内核设置为public成员,这允许我在声明之后和开始处理之前配置内核。
如果一段代码知道它使用的具体内核类型,那么它应该有一个指向该具体内核类型的指针。如果没有,它就不能访问它的特定参数(但可以像@Jaywalker建议的那样以通用的方式访问所有参数)。
您当前的实现似乎走了第一条路线,这是完全可以的。
我对你的设计有非常有限的信息,但看起来你有几个具体的内核类型,每个类型一个单独的构建器,每个类型一个单独的配置器。将所有构建器打包到一个Factory中是有问题的,因为没有一种干净而优雅的方式将具体的内核类型转发给它们各自的配置器(没有*_cast<>
或双调度之类的东西)。至少有两种方法可以解决这个问题,并且仍然有一个工厂:
- 将每个构建器与其各自的配置器捆绑在一起,并将所有捆绑包打包到一个工厂中,该工厂生产配置的内核。
- 将每个内核与其配置器捆绑在一起,并创建一个工厂来生成这些包(这样内核在其生命周期中可以被配置任意次数)。
如您所说,任何不属于原型界面一部分的内容都将无法在Foo
中使用。如果Foo
知道每个内核实现的细节,那么使用工厂模式就没有意义了。
在某些有限的情况下,在原型界面中添加如下getter和setter可以完成您的工作:
virtual bool setParameter (const string &key, const string &value) = 0;
virtual string getParameter (const string &key) = 0;
- 返回复合模式的复合对象不返回整个对象
- 在函数中声明的 ifStream 对象在发布模式下不起作用
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 是否很好地使用状态模式来维护当前选定的对象?
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- C++11 中的对象验证逻辑模式
- 设计模式中对象中的过程(方法和操作)的状态
- 哪种设计模式仅出于代理目的而组成的对象与之相关
- 如何提取由特定模式分开的JSON对象字符串
- 对象在播放模式下中断层次结构
- 从对象成员函数内部删除操作的技术 /设计模式
- 共享对象工厂的设计模式
- 命令模式:如何进行连续操作?(例如,移动对象)
- C (MVC模式)中的对象所有权
- 带参数的单例模式对象
- 模板化模式对象和外部密码对象有什么区别?
- Cocos 2dx 人像模式对象位置混乱
- 如何实例化模式对象
- 设计模式-C++对象生命周期评测