C# 設計模式之單例模式歸納總結。本站提示廣大學習愛好者:(C# 設計模式之單例模式歸納總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 設計模式之單例模式歸納總結正文
優缺點
優點:
一、實例控制
單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。
二、靈活性
因為類控制了實例化過程,所以類可以靈活更改實例化過程。
缺點:
一、開銷
雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
三、對象生存期
不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於.NET Framework的語言),只有單例類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導致單例類中出現懸浮引用
C#
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點
實現要點
Singleton模式是限制而不是改進類的創建。
Singleton類中的實例構造器可以設置為Protected以允許子類派生。
Singleton模式一般不要支持Icloneable接口,因為這可能導致多個對象實例,與Singleton模式的初衷違背。
Singleton模式一般不要支持序列化,這也有可能導致多個對象實例,這也與Singleton模式的初衷違背。
Singleton只考慮了對象創建的管理,沒有考慮到銷毀的管理,就支持垃圾回收的平台和對象的開銷來講,我們一般沒必要對其銷毀進行特殊的管理。
理解和擴展Singleton模式的核心是"如何控制用戶使用new對一個類的構造器的任意調用"。
可以很簡單的修改一個Singleton,使它有少數幾個實例,這樣做是允許的而且是有意義的。
優點
實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例
靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程
缺點
開銷:雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題,上面的五種實現方式中已經說過了。
可能的開發混淆:使用 singleton 對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用 new 關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
對象的生存期:Singleton 不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於 .NET Framework 的語言),只有 Singleton 類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除
對象實例,但這樣會導致 Singleton 類中出現懸浮引用。
適用性
當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
當這個唯一實例應該是通過子類化可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時。
代碼示例:
雙重鎖機制
namespace Singleton { public class Singleton { //定義一個私有的靜態全局變量來保存該類的唯一實例 private static Singleton singleton; //定義一個只讀靜態對象 //且這個對象是在程序運行時創建的 private static readonly object syncObject = new object(); /// /// 構造函數必須是私有的 /// 這樣在外部便無法使用 new 來創建該類的實例 /// private Singleton() {} /// /// 定義一個全局訪問點 /// 設置為靜態方法 /// 則在類的外部便無需實例化就可以調用該方法 /// /// public static Singleton GetInstance() { //這裡可以保證只實例化一次 //即在第一次調用時實例化 //以後調用便不會再實例化 //第一重 singleton == null if (singleton == null) { lock (syncObject) { //第二重 singleton == null if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } }
希望本文對您有所幫助