2011-08-22 28 views
6

我一直都知道單例是「壞」的,但是現在只有我已經從C++轉向Java,我才決定找到解決方法。從一些閱讀中,我發現無論是工廠還是依賴注入都可能完成這項工作,但是我希望對此有所確認。作爲一個例子,我正在編寫一個AnimationCache單例,它將存儲Map<String, Animation>。不同的類應該能夠訪問此類(基本上),以便他們可以輕鬆高效地加載動畫。使用DI的等效代碼看起來很簡單的例子會很棒。使用依賴注入作爲單例的替代

另外,Guice是一個很好的DI與非網絡應用程序框架?我使用Spring進行Web開發,但我不太確定適用於遊戲。

+0

春季DI不僅適用於網絡應用程序。 – gtiwari333

+0

更新:您可能還想考慮[CDI 2.0 - 用於Java的上下文和依賴關係注入](http://cdi-spec.org)。自2017-04年起[JSR 365](https://jcp.org/en/jsr/detail?id=365)標準化。爲* Java SE和Java EE *而設計。 –

+0

此問題及其答案可能與未來的讀者有關:https://stackoverflow.com/questions/130794/what-is-dependency-injection?rq=1 – Cypher

回答

5

春季和吉斯會做得很好。我個人更喜歡Guice純粹的依賴注入,但是Spring提供了更多。

的代碼只是看起來像這樣:

public class AnimationCacheClient { 

    private AnimationCache cache; 

    @Autowired // for Spring, or 
    @Inject // for Guice (but I think Spring also supports it now) 
    public AnimationCacheClient(AnimationCache cache) { 
     this.cache = cache; 
    } 

    // ... 
} 

我personnally喜歡構造函數注入,但你也可能使用setter注入或字段注入。

請注意,DI的目的不是「簡單單身」,但。它的主要目的是通過注入模擬依賴關係(這裏是一個模擬AnimationCache實例)使代碼(此處爲AnimationCacheClient)容易適用於單元。

+0

感謝您的代碼示例。這看起來很簡單。所以我錯在假設依賴注入可以代替單身人士?我真的正在尋找一種更好的方式讓代碼訪問一個應該只有其中一個類的類。 – Mitch

+0

不,你沒有錯。默認情況下,Spring bean是單身人士。 Guice beans默認是原型,但可以配置爲singleton。我只想指出DI的主要目標不是讓單身人士變得簡單。其主要目標是使測試變得簡單。 –

1

我最近在單身人士身上使用了這個thread,以及它可能有多糟(或沒有)以及你可以繞過它做什麼。值得一讀。