2017-04-18 207 views
0

我参考GoF 抽象工厂工厂方法模式。我理解他们的目的,但是让我感到困惑的是,两种模式都没有讨论客户如何获得“工厂对象”的实例。例如,在下面的抽象工厂模式,讨论假定一些其他的框架或驱动程序代码已经构造的层次结构,并且Application实例已经持有的GUIFactory(无论WinFactoryOSXFactory工厂创建工厂?

(源的实例:https://en.wikipedia.org/wiki/Abstract_factory_patternAbstract factory pattern

类似的争论还在继续朝着工厂方法模式。讨论假定外面的其他东西已经实例化MagicMazeGame。

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

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

(来源:领域驱动设计,埃里克·埃文斯2003) factory pattern

这是无论从抽象工厂工厂方法不同的图案,在我看来。客户根据配置和上下文,根据要求以及来指定要求并且工厂创建对象。作为一个假设示例,客户端指定它想要抽象Connection对象,工厂将创建一个MySQLConnectionOracleConnection,具体取决于系统中配置的数据库驱动程序。

所以,我的问题是:

  • 是有我所描述的最后一个模式的一个术语? (我试过研究,但工厂一直意味着GoF的工厂模式)
  • 创建工厂的工厂应该命名为什么? GUIFactoryFactory ???
  • 还是我完全错了这一切?

我知道这个问题,只是询问如何命名的东西,但使用通用语言(来源:领域驱动设计,Eric Evans的2003年,我完全同意)也是在软件工程中非常重要我的想法是。

回答

2

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

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

埃里克埃文斯的图似乎是一个建筑视图,其中工厂被用作任何工厂模式的占位符。换句话说,它可以代表抽象工厂,工厂方法或GoF之外的其他工厂模式。特定的工厂模式在体系结构级别并不重要,只有客户机将实例化逻辑推迟到某个其他组件的想法。