2009-06-13 66 views
0

四人幫使用負載平衡器示例來演示單例模式。我只是想知道爲什麼在這個例子中需要使用單例?是否還有其他真正的例子可以用單例模式進行具體演示?單例示例

我只想知道更多具體的原因,爲什麼我想防止創建一個以上的對象實例。而且,我的意思是,如果有多個負載均衡器實例,那又如何?

+0

對於人們關於何時使用Singleton的一般爭論,請參閱http://stackoverflow.com/questions/86582/singleton-how-should-it-be-used – 2009-06-13 02:47:03

回答

0

在一個應用程序中,我有一個清單,用於保存從服務器檢索的XML數據。這起到了一種「緩存」的作用,可以防止查找多次發生。我沒有將對象的引用傳遞給對象,而是創建了一個Singleton,它可以在運行時由任何對象訪問。

+0

我喜歡這個答案最好,但它仍然只是討論易用性,而不是Singleton實現的NEED。 我想我沒有得到的是,如果我寫我的代碼,只調用一個對象的構造函數,是不是這樣的控制級別使單一類的單一? – 2009-06-15 14:18:43

+0

如果您保證只調用一次某個構造函數,那麼通過一切手段 - 保持簡單並且不要使用Singleton。然而,問題是未來的可擴展性和變化。你能保證你永遠不需要再次調用構造函數嗎?如果不是的話,你能否通過參考來傳授課程,還是會讓你的設計更加複雜?控制對象的構建是面向對象的一個​​重要方面,而且實際上只需要一些預先設想。如果你不需要Singleton(或者想避免使用它的一些問題),簡單將決定不使用一個:) – bedwyr 2009-06-15 14:58:57

0

我剛剛用一個實例化一個ASP.NET應用程序的Flexwiki引擎,因爲對於那個特定的應用程序,我只需要將wiki語法轉換成HTML的功能。引擎本身消耗大量內存,我只需要它的一小部分來滿足我的需求。此外,它不依賴於個人用戶,因此可以將其存儲在緩存中。擁有另一個引擎實例將毫無意義,因爲除了浪費內存外,它沒有其他用途。

0

如果您有一個客戶端服務器應用程序,那麼您的服務每個連接可能只需要一個客戶端。例如,我需要我的服務註冊一個回調:

public class myClient 
{ 
    public myClient() 
    { 
     myService = // get service somehow 
     myService.Init(myCallback); 
    } 
    public void myCallback() { /* do something*/} 
} 

如果創建myClient的第二個實例,你將覆蓋與第二第一回調。

2

如果一次有多個工作負載平衡器不能很有效。如果一個負載均衡器將工作分配給設備,則另一個均衡器出現並將工作分配給同一設備,則系統很容易變得不平衡。多個負載均衡器需要相互通信才能完成他們的工作。擁有平衡器的單個實例更簡單,更高效。

調用Singleton的應用程序的另一個例子是一個軟件模塊,它的工作是與串口上的設備對話。我最近實施了一個與電機控制器通信的課程,我想確保只有一個班級訪問串行線路。將這個類作爲Singleton實現可以確保永遠不會創建兩個實例,從而避免爭用串口線。