有没有办法在c ++中实现动态工厂模式?

时间:2015-11-30 10:32:25

标签: c++ reflection factory factory-pattern

  

DYNAMIC FACTORY模式描述了如何创建工厂   允许创建源自同一产品的意外产品   通过存储有关其具体类型的信息来实现抽象   外部元数据

来自:http://www.wirfs-brock.com/PDFs/TheDynamicFactoryPattern.pdf

2 个答案:

答案 0 :(得分:2)

PDF说:

  

可配置   。我们可以通过更改其配置来更改应用程序的行为   信息。这可以在 完成,无需更改任何源代码 (只需更改元数据存储库中类型的描述性信息)或重新启动应用程序(如果缓存不是used - 如果使用缓存,则需要刷新缓存。)

如果不修改源代码,就无法在正在运行的C ++程序中引入新类型。至少,您需要编写一个包含工厂的共享库来生成新类型的实例:但这样做明确地由PDF规定:

  

可扩展性/可演化性   。新产品类型应该很容易   添加没有 既不需要a   新工厂类也没有修改   任何现有的

这在C ++中不实用。

然而,功能可以通过使用元数据来指导一些代码编写功能,然后调用编译器(无论是作为子进程还是库)来创建共享库来实现。这几乎是PDF中提到的语言在使用反射和元数据要求虚拟机创建新的类实例时所做的事情:在那些语言环境中需要编译器/解释器的一些内容在内存中闲置,所以它似乎没有那么大的一步。

答案 1 :(得分:1)

...是

查看Factories Qt库中的Qtilities类。

@TonyD关于

  

我们可以通过更改其配置信息来更改应用程序的行为。

如果你用另一种方式解释句子,那是100%可能的。我读到并理解的是您更改了加载的配置文件(doc中的xml)以更改应用程序的行为。因此,您的应用程序可能有2个记录器,一个用于文件,一个用于GUI。因此,可以编辑配置文件以选择要使用的一个或两个。因此,应用程序没有变化,但行为发生了变化。要求是您可以在代码中使用文件中可以配置的任何内容,因此说使用网络的日志将无法正常工作,因为它未实现。

  

应轻松添加新产品类型,既不需要新工厂类也不需要修改现有工厂类。

是的,听起来有点不可能。我将接受添加一个的能力,而无需更改原始应用程序。因此,应该能够使用插件或其他方法添加并使应用程序/工厂/现有类保持不变。

所提供的示例均支持以上所有内容。虽然Qtilities是一个Qt库,但工厂并不是Qt特定的。