簡體   English   中英

單身設計模式與靜態類

[英]Singleton design pattern vs static class

當Singleton設計模式優於靜態類並且靜態類優於Singleton設計模式時,有哪些情況?

一般來說,單身人士優於靜態階級。

單例靜態類相反:

  • 可以繼承,可以繼承;
  • 可以實現接口;
  • 可以序列化;
  • 可以傳遞給其他類;
  • 可以處置。

如果你選擇靜態類,那么你選擇具體 ,沒有靈活性。 但是,如果你使用單例,你必須記住使它的實例化線程安全

這不是一個或兩個場景。

單例是具有靜態getter和私有構造函數的實例。 它們不是靜態類。

具有某些附帶條件的單身人士是確保您只有一個班級實例的方法。

所以第一個問題是。 你需要一個實例,即這個東西是否有狀態,第二個問題是他們進行單元測試有多困難,你想要一個嗎?

例如,查看服務定位器模式。

如果您只使用類作為某些函數的容器,請使用靜態類..但在大多數其他情況下,您最好使用Singleton設計模式,因為您可能希望重用該對象或實例化它作為一個非單身人士。

靜態類是特殊的難以測試。 並且你不能使用構造函數來做任何有用的事情。

靜態類在諸如MVC助手之類的輔助方法中是首選的。

你可以在這里看到靜態類的限制。 它們只能有靜態構件並且是密封的。

我最后的討論是:1。一個物體有一些狀態。 State表示對象屬性的當前值。 因此,如果您想要一個場景,您希望某個狀態可以更改,並且只想擁有一個實例,那么請使用Singleton類。 例如,假設有一個日志文件要在某些成功操作或某些異常后更新。 要更新此日志文件,我們必須對其進行鎖定以避免任何不一致的數據,並且可以通過Singleton類來實現。 2.當您不需要對象的狀態並且希望在應用程序啟動時將您的類加載到內存中並保持應用程序的生命 - 使用Static類。

您可以使用靜態類為您提供不需要任何狀態的簡單方法,以及何時不需要實例化對象。

使用單例意味着您只需要對對象進行一次實例化,然后可以傳遞它並改變其狀態。 使用單例,您還可以繼承或實現接口。

兩者之間的主要區別在於單例可以實現接口,並且允許根據測試或運行時原因更改其行為。 靜態類是靜態的,雖然它可以具有狀態,但是大幅改變它的行為將是困難的。

作為類的實例的單例可以實現接口,並且如果與期望該接口的方法一起使用,則可以容易地用不同的行為替換。

記錄是兩者的常見用法。

靜態記錄器不太可能能夠記錄到不同的介質(數據庫,xlm文件,文本文件,json,流,webservice),因為您必須使用不同的API進行調用,或者設置某個狀態然后全部這些方法可以阻止所有不同類型的持久性。

單例記錄器可以實現ILog,然后如果您需要從日志記錄切換到數據庫以記錄到Web服務,您只需使用另一個類(可能是也可能不是單例)。

單身可以用來緩慢地遠離靜態類。 當您意識到永遠不會改變行為時,靜態類可以替換單例。

兩者都難以自我測試。 但是測試使用它們的其他類可能是個問題。 特別是一個靜態類 - 在測試和生產時,在某些方面(比如記錄,或者文件的源/目標是文件共享與共享點)要求稍微不同的行為並不是未知的。 在這種情況下,讓類成為單例允許更容易地改變該行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM