2012-04-13 53 views
2

所以我最近被添加到一個新的項目中,並且Java代碼大約有10-15個Singleton類被廣泛使用。這些類的目的是從服務器獲取數據(當客戶端應用程序啓動時)並在整個程序中訪問該數據,以便每次需要時都不必進行服務調用,這在我看來很有意義。我該如何替換這個Singleton?

然而,在閱讀了很多關於單身人士是多麼可怕的帖子後,由於緊密耦合和無法測試,我將如何去替換它們?我已經被告知了依賴注入,但是我真的想繼續傳遞相同的數據給應用程序中的幾乎每個對象嗎?任何建議都很有用。

+3

我很想在這個問題上採取措施,但它太廣泛了。標題意味着你有一個特定的單身人士 - 你能發表一個你想替換的具體例子嗎? – 2012-04-13 03:33:32

+0

查看下面的評論。 – Pattay 2012-04-13 03:41:43

回答

2

在這種情況下,我使用依賴注入(DI),但正如你所說,你不喜歡它。

我能想到的下一件事是FACADE模式,創建一個ApplicationFacade類並在需要的地方使用DI。 (或者如果你真的不喜歡DI,請將它設爲靜態)

0

我相信這取決於每個單身人士。例如,Singleton可以分解爲幾個靜態函數嗎?或者它可以分解成幾個小類。也許它只用於應用程序的一小部分;因此,爲了在該模塊中使用而重構較小的類。我想,最終,這取決於每個單例的使用。如果它使你的代碼更簡單,更可擴展,更清潔等,然後保持它;如果不是,則重構。

編輯:添加,需要重構什麼?代碼簡單,乾淨並且工作正常嗎?如果是這樣,那麼只需要嚮應用程序添加功能即可。總是希望添加代碼/功能,而不是修改現有的代碼。最後你必須回答,它是否可擴展?

+0

大多數這些類用於訪問從服務器獲取的某種數據。例如,單身人士A在初始化時進行服務調用以獲取一些數據。這個類現在有2-3個在整個程序中被訪問的Collection對象(它們是不可修改的)。有一個Singleton是否有意義,以便程序的類可以使用這些數據來執行它的必要功能? – Pattay 2012-04-13 03:41:07

0

看看Guice。你定義你的構造函數只需要直接依賴(沒有工廠工廠向下傳遞深度依賴),用@inject註釋每個可注入構造函數,然後創建「模塊」類,定義用於任何抽象類或接口的實現那些構造函數。

Guice將使用反射魔法來根據模塊類中的指令查找實現並實例化對象圖。它甚至足夠聰明,可以自動使用無參數構造函數來創建依賴關係,而在沒有明確告訴它的情況下,它們並未在模塊中明確定義。你可以讓Guice與你的架構有更多的交織,但如果你想避免的是一連串注入依賴的工廠,那麼一個小小的Guice是相當不錯的。

0

你可以設計你的類的方式是顯式依賴的因素。如果一個班級使用單身人士:

class Client { 
    public void Method() { 
    SomeService.getInstance().doSomething(); 
    } 
} 

它隱藏了裏面的依賴關係。將其拉出,(1)把它在建築或(2)所涉及的方法中,如果是有意義(示出選項2):

class Client { 
    public void Method(SomeService service) { 
    service.doSomething(); 
    } 
} 

這是第一個步驟。稍後,您可以從單例中提取一個接口並使用它。這是一個緩慢的過程:重構,重新測試,迭代...