工厂创建工厂?

时间:2017-04-18 19:45:40

标签: design-patterns abstract-factory factory-method

我指的是GoF 抽象工厂工厂方法模式。我理解他们的目的,但是我的错误是两种模式都忽略了客户端如何获取“工厂对象”实例的讨论。例如,在以下抽象工厂模式中,讨论假定某些其他框架或驱动程序代码已经构建了层次结构,并且Application实例已经拥有{{1}的实例(GUIFactoryWinFactory

(来源:https://en.wikipedia.org/wiki/Abstract_factory_patternAbstract factory pattern

类似的论点转向工厂方法模式。讨论假定外面的其他东西已经实例化了MagicMazeGame。

(来源:https://en.wikipedia.org/wiki/Factory_method_patternFactory method pattern

为什么打扰我?因为我们需要另一种模式来构建这些对象层次结构,并且该模式是许多人在说出工厂时实际意味着的模式。基本上工厂模式如下:

(来源:Domain Driven Design,Eric Evans 2003) factory pattern

在我看来,这是与抽象工厂工厂方法不同的模式。客户端指定需求,工厂根据需求以及基于配置和上下文创建对象。作为一个假设的示例,客户端指定它需要一个抽象的OSXFactory对象,工厂根据系统中配置的数据库驱动程序创建ConnectionMySQLConnection

所以,我的问题是:

  • 我描述的最后一个模式是否有一个术语? (我试过研究,但术语工厂总是指GoF中的工厂模式)
  • 创建工厂的工厂应该命名为什么? OracleConnection ...
  • 或者我对这一切完全错了吗?

我知道这个问题只是询问如何命名,但使用无所不在的语言(来源:Domain Driven Design,Eric Evans 2003.我完全同意)也非常重要。我认为软件工程。

1 个答案:

答案 0 :(得分:3)

用于构造对象层次结构的模式称为Composition Root。这种模式适用于任何旨在实现界面的具体对象的构造,包括旨在实现工厂界面的混凝土工厂。

组合Root通常与依赖注入一起使用,因此有趣的是,当他在2009年被问及如何“重构”GoF书时,Erich Gamma mentioned添加了依赖注入。

Eric Evans的图表似乎是一个架构视图,其中术语 factory 用作任何工厂模式的占位符。换句话说,它可以代表抽象工厂,工厂方法或GoF之外的一些其他工厂模式。特定的工厂模式在架构级别无关紧要,只有客户端将实例化逻辑推迟到其他组件的想法。