2009-10-15 59 views
14

工廠類是靜態的,工廠方法也是靜態的。工廠創建方法始終是靜態的?

設計模式書中的GOF是否曾經規定工廠及其方法必須是靜態的以滿足模式的嚴格定義?

工廠+ /方法是靜態模式的結果嗎?狀態數據通常不由工廠類維護,因此它們通常是靜態的。

回答

11

我不認爲有這樣的事情是一種模式的「嚴格定義」。通過它們的本質模式來捕捉問題的本質,這些問題在軟件中一次又一次地出現並概述解決方案的外觀。

特別是對於工廠模式,不,不要求工廠方法是靜態的。模式的本質是你有一個對象負責創建另一個類的實例。你如何做到這一點真的取決於你,儘管模式中描述的一種常見方式是在類上使用靜態方法。但是,我們的系統中有一個工廠機制,實際上是兩階段的。您可以在類上使用靜態方法來創建工廠對象,該工廠對象可以被配置爲在一組實現中進行選擇,然後使用工廠對象來標記需要進行實際工作的對象實例。

也考慮在沒有靜態方法的語言中實現工廠模式。例如,在Scala中,你會使用一個對象而不是一個類。雖然這種行爲很像在Java的類中使用靜態方法,但實現的性質卻大不相同。

+2

+1真正重要的是不要期望模式能夠爲你做出思考,模式不嚴格,模式不寬鬆,模式無法控制! – djna 2009-10-15 08:44:11

6

不,工廠可以保持狀態。這取決於需要什麼。

我建議製作靜態在第一個例子中似乎是個不錯的選擇 - 當你嘗試單元測試你傾向於遇到問題的靜態時。

轉向,直到你特別需要它們。

+0

對某些語言 – 2012-05-25 16:22:41

3

不,工廠類別默認情況下不應該是靜態的。實際上,OOP世界並不歡迎靜態類,因爲它們也可以傳達某種狀態,因此引入了全局應用程序狀態。如果你只需要一個工廠對象,你可以通過單例模式來控制它的創建。

如果是工廠方法 - 可以保持靜態(實際上沒有其他合理的方法:))。

0

我想我的BlueCarFactory和我的RedCarFactory都有一個方法createCar。通過參數化重用實際創建方法是常識。然後創建一個CarFactory(blue)和一個CarFactory(red)。這意味着CarFactory對象需要一個成員變量來存儲生產的汽車的顏色。結論:使Factory類的方法靜態是沒有意義的。創建單體Factory對象確實有意義。