2012-02-17 76 views
2

我正在閱讀工廠方法模式,因爲我有一些與它相關的問題,但我無法從核心中理解它。按照定義所述here瞭解工廠方法模式

對象的創建往往需要複雜的過程不 適合於構成對象內包括。對象的創建可能會導致代碼的重複,可能需要構成對象無法訪問的信息,可能不會提供足夠的抽象級別,否則可能不會成爲組成對象關注點的一部分。

我能理解的顯著重複代碼的概念,但我無法理解其他概念,如它指出

它可能需要到合成對象

無法訪問信息

一個類如何可以包含構成對象時無法訪問的信息。據我瞭解,它可能是該類的任何private datamember。但是,如果有什麼東西是private那麼對象創建過程如何需要這些信息呢?同樣,其他兩點

它可能不提供足夠的抽象級別,或可能不會成爲組成對象的問題的一部分。

任何機構可以在這裏介紹這些恰恰和展示我的一些代碼的東西,所以我能理解這個概念

回答

1

工廠模式的想法是創建負載類和動態創建新的對象。通常它是作爲一個靜態類來完成的(例如在官方的PHP文檔中的here),但是一些框架使用工廠模式作爲在MVC對象中加載對象的方式,例如當你想通過模型。

工廠模式的思想是效率和資源管理。只有當它尚未加載時才加載文件並返回新創建的對象。

(請注意,PHP文件中的例子並不理想,這將是更好的檢查,如果類已經被定義,如果沒有,然後嘗試包括,而不是使用include_once文件())

1

時它涉及到使用我們的對象外部資源,其創作有替代方案浮現在腦海中:

  1. 要使用它的構造
  2. 要問另一個目的是創造它爲我們的對象(工廠和 廠創建對象方法模式)。這種方式我們的對象不知道如何 創建外部資源,但它應該知道誰要求 它(它需要持有工廠參考或知道工廠的類型 的情況下調用靜態工廠方法)
  3. 要注入外部資源使用IoC(反轉控制) 容器。這樣,我們的對象不會對任何關於如何創建外部資源的內容都不知道,也不知道如何創建外部資源。實際上,這種方法正在使工廠模式變得不再適用。
+0

1692謝謝老兄。但是,這裏的「外部資源」是什麼意思? – 2012-02-17 10:15:36

+0

我的意思是你的對象需要用來執行它正在做的事情的任何服務或對象 – Beatles1692 2012-02-17 22:43:59

1

想象一下,您正在編寫一個API,通過該API用戶可以創建和使用某個對象。在內部,在API框架,你要註冊你的對象以某種服務,聽衆,數據庫......

在這裏你有處理情況的兩種不同的方式:

  • 你要麼讓用戶創建該對象並負責將其註冊到應該公開的服務,偵聽器和數據庫中。

OR

  • 你要提供一個公共工廠類,將創建給予一定的參數的對象,並採取了所有的必要的初始化爲你的照顧。

第二種情況是隱藏在系統中創建此類對象的所有複雜性的最佳方法。這還具有隱藏註冊創建對象所需的服務,偵聽器和數據庫的巨大好處。