2011-09-06 136 views
3

當對象創建周圍存在複雜性時,通常會使用工廠模式,並且複雜性會將創建範圍無法訪問(應該無法訪問)的信息合併到一些必需的不可避免的變通方法中。具有工廠模式的單例模式爭議

我經常讓工廠變成單身人士,因爲不需要多個工廠。並將同一工廠傳遞給多個類看起來很奇怪。 passing a whole Factory in parameter

關於單例模式已經引發了很多爭議。那麼我應該讓工廠仍然是單身人士嗎?

工廠需要訪問需要工廠生產某種產品的每個角落。這需要通過該工廠作爲參數。並再次通過一個鏈。並且該鏈不會是單向的。這將很容易使分支機構。這也會導致測試困難。

+5

這是一個討論主題,而不是一個問題。也許把它移到更相關的位置? – mydogisbox

+1

我同意mydogisbox。這是那些「取決於」的問題之一。 –

+0

任何原因,它必須是一個單身人士,不能只是一個獨立的工廠功能? –

回答

0

不,你不應該這樣做,實際上單身模式經常被看作是來自某人的反模式。

最好的事情是依靠一些IOC容器,避免兩個單身都工廠模式。

+0

某人不是上帝。有人說它的反模式不是一個好的推理 –

+0

也許不是上帝本身,但有人比我更可靠 – Simone

+0

單身人士是一個反模式,因爲信息是全球化的明顯原因;我認爲你同意我說全局變量是一個反模式 – Simone

2

我跟道格T.

你可以很容易地創建可用於創建一個類(工廠函數)的實例的類中的靜態功能的副作用。更好的是,您可以創建一個工廠類,並使工廠類中的靜態函數生成所需的對象。 C#實際上提供了靜態類,其中所有成員和函數都是靜態的,就像這樣 - 它本質上是一個單例。

這裏的要點是,無論你做什麼,只需將函數指針作爲參數傳遞給工廠函數可能會更有意義。然後,您可以靈活地在那裏存儲創建邏輯,並且可以選擇完全避免單身人士/額外班級。 (PS:我認爲單身人士是一個很好的模式,但是如果你過度使用它們,它們會變成反模式,因爲它們會將設計減少到僅僅具有全局函數和數據的狀態)。

+0

是不是靜態和Singleton差不多相同?並且工廠必須達到需要生產產品的每一端。傳遞和攜帶工廠的鏈條不是單向鏈條。它很容易分發。所以它會在測試時出現問題。 –

+1

@NeelBasu靜態是靜態的。你知道它們是靜態的,因爲這就是它在類型數據中所說的。單例假裝不是靜態的,但實際上有內部邏輯來確保你只使用一個實例(並且每次都使用該實例)。單身模仿靜態行爲,所以使用靜態。 – Raynos

+0

@Neel Basu:Static和Singleton在概念上有些相似。您對該連鎖店的評論很不清楚。 – Beta

3

一個類不需要是一個單例來提供一個共享實例,並且您只有一個實例的事實並不意味着該類必須是單例。如果你必須只有一個實例,那就是使用單例的地方。工廠模式中沒有什麼要求您只有一個工廠 - 很容易想象有幾個工廠各自配置不同,並且每個工廠都創建不同的配置對象。

+0

請查看編輯 –

+1

的最後部分@NeelBasu,我看到了,但我不認爲Singleton是唯一的答案,或者它通常是最好的答案。全球接入不應成爲支持糟糕的面向對象設計的柺杖。如果您創建的工廠遠離使用它的地方,那可能意味着需要改變對象相互連接的方式。 – Caleb