2014-03-19 32 views
0

我讀到的關於服務/工廠/供應商的最清晰的例子之一是,它們對應於:一輛汽車,一個爲您提供汽車的工廠(例如紅色汽車,藍色汽車)以及一個輸出汽車的可配置工廠(例如高 - 質量的汽車,低質量的汽車)這是服務和工廠之間的區別嗎?

雖然令我困惑的部分是「一切都是單身」的解釋。從上面的例子中,我假設一個「服務」是一個單獨的返回自己,並且工廠和提供者是返回對象(每一個都是唯一的)的單例。也就是說,如果一個控制器得到一輛藍色的汽車,另一個控制器則是一輛紅色的汽車,他們將是兩輛獨立的汽車。

我認爲雖然混淆來自工廠以兩種不同的方式編寫。有一種方法,你返回一個對象。這使得它在功能上等同於「服務」。換句話說,你返回的是一個可實例化對象的函數,這樣任何使用這個工廠的東西都可以得到新的獨立實例。

這是正確的嗎?寫出工廠的兩種方法中的任何一種都是反模式?

+0

的可能重複[Angular.js:服務提供商VS VS工廠(http://stackoverflow.com/questions/15666048/angular-js-service-vs -provider-vs-factory) – hassassin

+0

我真的希望他們在Angular2中清理它。它過於複雜,沒有我能看到的真正好處。無論如何,內部所有方法都會調用'factory'。 –

+0

我根本沒有發現它很複雜,你有工廠返回的東西和服務,它返回一個經典的方法很好的構造函數..我使用工廠像揭示模塊模式 –

回答

1

從我寫的一篇博文專門回答這個問題:

所以就在這裏。我要總結一下,然後再舉幾個例子:

  • 當你想傳遞一個構造函數時使用一個服務。將使用「新」運算符調用 函數,並存儲結果 。
  • 當您想從 函數(即工廠模式)返回對象時使用工廠。該函數將被調用並且存儲結果 。
  • 如果希望在提供對象之前能夠爲對象提供 模塊範圍的配置,請使用提供程序。

爲什麼有多種方式?主要是因爲一些坐在像TypeScript和CoffeeScript這樣的JavaScript上的系統生成的代碼要求一種方法優於另一種,所以它具有靈活性。

要查看完整的文章舉例:http://csharperimage.jeremylikness.com/2014/01/understanding-providers-services-and.html

+0

因此,使用工廠返回一個函數(而不是一個正常的對象),因此能夠實例化它返回的內容不應該被使用,並且是一個黑客? – user2483724

+0

這些名字是壞名字。工廠意味着使用工廠來建立服務,服務意味着使用構造函數。他們最終都是單身。如果你想創建你自己的工廠,你仍然可以使用任何一種方法。一個服務可以擁有一個帶有函數的函數,該函數返回新的實例,並且一個工廠可以返回它自己的返回新實例的函數。 –

+0

啊我看到,如果有必要,服務還可以幫助您實例化新實例。 「工廠」這個詞與我「創造新的物體」連接得太多。謝謝你清理那個。 (打字稿/咖啡豆支持的解釋也不錯!_ – user2483724

0

我所看到的與工廠的關係相當於Javascript中的揭示模塊設計模式。

模塊設計模式 - Singelton:

var x = (function() { 
    var y = 1, 

    zMethod = function() { 
     return y + y; 
    } 

    return { 
     y: y, 
     z: zMethod 
    } 

}()); 

角廠:

angular.module('app', []) 
    .factory('x', function() { 
     var y = 1, 
     zMethod = function() { return y + y; } 

     return { 
      y: y, 
      z: zMethod 
     } 
    }); 

有助於澄清是怎麼回事幕後......但是,這只是三個部分之一!

相關問題