设计模式——单例模式(Singleton)
生活随笔
收集整理的這篇文章主要介紹了
设计模式——单例模式(Singleton)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。——DP
UML類圖
模式說明
個人認為單例模式是所有設計模式中最為簡單的一個模式,因為實現這個模式僅需一個類,而不像其他模式需要若干個類。這個模式中,需要注意的一點就是獲取實例時的線程安全問題。
通常單例模式的實現方式如下:
class ToolBox{// 阻止外部實例化ToolBoxprivate ToolBox(){guid = Guid.NewGuid();}private static ToolBox instance;private static object lockObj = new object();//提供一個全局訪問點public static ToolBox GetToolBoxInstance(){if (instance != null) return instance;//要考慮線程安全問題lock (lockObj){if (instance == null){instance = new ToolBox();}}return instance;}#region 用于測試private Guid guid;public void ShowGuid(){Console.WriteLine(guid.ToString());}#endregion}
另外,C#語言中提供一種“靜態初始化”功能,對靜態初始化器的調用是由CLR控制的,并且CLR會解決線程安全問題,保證只調用一次。所以也可以利用這個特性,來簡化單例模式的C#實現:
class ToolBox2{// 阻止外部實例化ToolBox2private ToolBox2() { guid = Guid.NewGuid(); }//靜態內聯初始化private static readonly ToolBox2 instance = new ToolBox2();//提供一個全局訪問點public static ToolBox2 GetToolBoxInstance(){return instance;}#region 用于測試private Guid guid;public void ShowGuid(){Console.WriteLine(guid.ToString());}#endregion}
客戶端訪問代碼如下(從輸出可以看到,每次訪問獲取的都是同一個實例):
static void Main(string[] args){// 測試單例模式for (int i = 0; i < 10; i++){new Thread(x =>ToolBox.GetToolBoxInstance().ShowGuid()).Start();}Thread.Sleep(200);Console.WriteLine();// 測試單例模式for (int i = 0; i < 10; i++){new Thread(x =>ToolBox2.GetToolBoxInstance().ShowGuid()).Start();}/* 輸出如下f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd58398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c*/Console.ReadKey();}
總結
單例模式和前面介紹的工廠模式(工廠方法、抽象工廠)都屬于創建型模式,負責類的實例化過程。單例模式的實現過程,只需要一個類,算是最簡單的一個模式,在多線程環境下,單例模式的實現必須保證線程安全,否則在多個線程同時訪問時,可能產生多個實例。在C#中,可以通過語言本身的特性(靜態初始化器)來更簡潔地實現單例模式。
參考
- 程杰老師? 《大話設計模式》
轉載于:https://www.cnblogs.com/hecool/p/3313409.html
總結
以上是生活随笔為你收集整理的设计模式——单例模式(Singleton)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果换冰箱门的封条要多少钱?
- 下一篇: hdu 4720