我指的是GoF 抽象工厂和工厂方法模式。我理解他们的目的,但是我的错误是两种模式都忽略了客户端如何获取“工厂对象”实例的讨论。例如,在以下抽象工厂模式中,讨论假定某些其他框架或驱动程序代码已经构建了层次结构,并且Application
实例已经拥有{{1}的实例(GUIFactory
或WinFactory
)
(来源:https://en.wikipedia.org/wiki/Abstract_factory_pattern)
类似的论点转向工厂方法模式。讨论假定外面的其他东西已经实例化了MagicMazeGame。
(来源:https://en.wikipedia.org/wiki/Factory_method_pattern)
为什么打扰我?因为我们需要另一种模式来构建这些对象层次结构,并且该模式是许多人在说出工厂时实际意味着的模式。基本上工厂模式如下:
(来源:Domain Driven Design,Eric Evans 2003)
在我看来,这是与抽象工厂或工厂方法不同的模式。客户端指定需求,工厂根据需求以及基于配置和上下文创建对象。作为一个假设的示例,客户端指定它需要一个抽象的OSXFactory
对象,工厂根据系统中配置的数据库驱动程序创建Connection
或MySQLConnection
。
所以,我的问题是:
OracleConnection
... 我知道这个问题只是询问如何命名,但使用无所不在的语言(来源:Domain Driven Design,Eric Evans 2003.我完全同意)也非常重要。我认为软件工程。
答案 0 :(得分:3)
用于构造对象层次结构的模式称为Composition Root。这种模式适用于任何旨在实现界面的具体对象的构造,包括旨在实现工厂界面的混凝土工厂。
组合Root通常与依赖注入一起使用,因此有趣的是,当他在2009年被问及如何“重构”GoF书时,Erich Gamma mentioned添加了依赖注入。
Eric Evans的图表似乎是一个架构视图,其中术语 factory 用作任何工厂模式的占位符。换句话说,它可以代表抽象工厂,工厂方法或GoF之外的一些其他工厂模式。特定的工厂模式在架构级别无关紧要,只有客户端将实例化逻辑推迟到其他组件的想法。