2011-11-30 66 views

回答

20

一家工廠爲您創建對象,請求時。

服務定位器返回可能已存在的對象,即可能已存在於某處的服務。

想想的名字的含義是:

  • 廠:是在其中創建對象的地方。
  • 服務:是一種可以爲您做點事情的服務。
  • 服務定位器:可以找到可以執行服務的東西。
+0

最後的服務是一個類,它做了一些事情。要檢索它,必須創建如此....服務定位器就像一個工廠,因爲它必須創建一個「新」 – toroveneno

+3

它不必創建一個新的服務對象...而是服務對象將是在嘗試定位服務之前註冊,可能是應用程序啓動時,以便將來服務定位器可以將該服務返回給調用者。 –

+0

就像答案的「簡單」一樣 – Spock

6

實際上這兩種模式之間都有明顯的分離。衆所周知,這兩種模式都用於避免具體類型的依賴性。

但是之後讀

一些嚴重的矛盾出現了:

西曼說:「一個抽象工廠是一個泛型類型, Create方法的返回類型由工廠本身的類型決定,換句話說,構造類型只能返回單一類型的實例。

儘管Rober C. Martin沒有提到有關泛型的任何內容,而且他的書中的工廠實例允許創建多個類型的對象的實例,使用一個鍵串作爲Factory.Make中的參數來區分它們()。

Gamma表示Abstract Factory的意圖是「提供一個創建相關或依賴對象族的界面,而不指定它們的具體類」。值得一提的是,Gamma抽象工廠的例子違反了Martin所說的接口隔離原則(ISP)。一般而言,ISP和SOLID是更現代化的原則,或者爲了簡單起見,可以省略。 Gamma和Martin的作品先於Seemann的作品,所以我認爲他應該遵循已定義的定義。

雖然福勒提出服務定位器作爲實現依賴倒置的一種方式,但Seemann認爲它是一種反模式。 Gamma或Martin都沒有提到服務定位器。

但是,Seemann和Fowler同意服務定位器需要一個配置步驟來註冊一個concretes類的實例,該實例將在稍後請求該類對象時返回。 Martin或Gamma在他們對抽象工廠的定義中未提及此配置步驟。抽象工廠模式假設每次請求該類對象時都會實例化一個新對象。

結論

服務定位器和抽象工廠之間的主要區別是抽象工廠假設一個新的對象被實例化在每個請求的返回和服務定位器需要與對象實例和每次被配置同樣的實例將被返回。

相關問題