2013-03-26 55 views
1

我正在寫一個桌面MMO遊戲,我想諮詢一下架構問題。我有NetworkManager,ClientWindow,CachingTextureAtlas等類,它們只需要在一個遊戲實例中使用,這裏是我的問題:使它們成爲單例是否正確?如果是的話,這將是一種通過全球課程進行的互動,從設計的角度來看,這並不是很好,因爲在我看來,如果沒有,我們會將它們組成一個外觀,我們必須將這些全部傳遞給構造函數太多的課程也不方便。什麼是更好的選擇?組成vs多個單身人士

回答

5

單身人士應該小心使用(幾乎從不)。我見過很多地方,最近的情況是hibernate會話工廠,最初我們認爲單個實例應該沒問題,但隨後出現了多個實例的場景,最終重構了代碼。 其他問題是,如果你正在爲你的代碼編寫單元測試,那麼對於所有依賴這些單例類的類來說,這將是一場噩夢。

其中一個解決方案可能是注入一種工廠,它可以爲您提供這些實例/它給您一種間接方式並避免直接耦合。另一種方法是擁有一個容器(例如pico容器)並注入構造函數依賴關係,這也是您已經指出的。

+2

+1表示依賴注入。錯過了:) – greenkode 2013-03-26 07:57:57

+0

所以你反對單例方法,你建議的是讓工廠持有所需類的實例?或者每次都提供一個新實例?我在服務器端使用Spring DI,我會考慮遠離單身人士,但我們應該如何處理客戶端,在Spring中沒有任何意義?而在CachingTextureAtlas的情況下,它是非常昂貴的,每次實例化它,謝謝;) – OneMoreVladimir 2013-03-26 08:00:02

+1

@OneMoreVladimir我寧願去依賴注入。這會從調用它的方法中抽象出實現。因此您可以更改實現並很可能永遠不必重構代碼。 – greenkode 2013-03-26 08:02:30