设计模式——单例模式(Singleton)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                设计模式——单例模式(Singleton)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。——DP
UML類圖
模式說明
個人認為單例模式是所有設(shè)計模式中最為簡單的一個模式,因為實現(xiàn)這個模式僅需一個類,而不像其他模式需要若干個類。這個模式中,需要注意的一點就是獲取實例時的線程安全問題。
通常單例模式的實現(xiàn)方式如下:
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#語言中提供一種“靜態(tài)初始化”功能,對靜態(tài)初始化器的調(diào)用是由CLR控制的,并且CLR會解決線程安全問題,保證只調(diào)用一次。所以也可以利用這個特性,來簡化單例模式的C#實現(xiàn):
class ToolBox2{// 阻止外部實例化ToolBox2private ToolBox2() { guid = Guid.NewGuid(); }//靜態(tài)內(nèi)聯(lián)初始化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();}
總結(jié)
單例模式和前面介紹的工廠模式(工廠方法、抽象工廠)都屬于創(chuàng)建型模式,負責(zé)類的實例化過程。單例模式的實現(xiàn)過程,只需要一個類,算是最簡單的一個模式,在多線程環(huán)境下,單例模式的實現(xiàn)必須保證線程安全,否則在多個線程同時訪問時,可能產(chǎn)生多個實例。在C#中,可以通過語言本身的特性(靜態(tài)初始化器)來更簡潔地實現(xiàn)單例模式。
參考
- 程杰老師? 《大話設(shè)計模式》
 
轉(zhuǎn)載于:https://www.cnblogs.com/hecool/p/3313409.html
總結(jié)
以上是生活随笔為你收集整理的设计模式——单例模式(Singleton)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 如果换冰箱门的封条要多少钱?
 - 下一篇: 为什么张学友和张家辉长得那么像 但就是觉