2017-04-18 216 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之外的其他工廠模式。特定的工廠模式在體系結構級別並不重要,只有客戶機將實例化邏輯推遲到某個其他組件的想法。