设计模式 (3) : 单例模式的几种方法
定義: 確保一個(gè)類只有一個(gè)實(shí)例, 并提供一個(gè)全局訪問點(diǎn)。
原理: c# 中用 new 方法創(chuàng)建一個(gè)實(shí)例需要調(diào)用類的構(gòu)造函數(shù)(注: 每一個(gè)類都必須有至少一個(gè)構(gòu)造函數(shù), 當(dāng)我們未定義構(gòu)造函數(shù)時(shí),編譯時(shí)編譯器會(huì)幫我們生成一個(gè)公有的無參數(shù)的構(gòu)造函數(shù)。), 當(dāng)構(gòu)造函數(shù)私有(private) 時(shí),在類外部無法創(chuàng)建創(chuàng)建類的實(shí)例。
常用的幾種實(shí)現(xiàn)方式:
1、只可在單線程下使用的實(shí)現(xiàn)
1 // 最簡單的單線程下的單例模式 2 public class Singleton 3 { 4 // 局部靜態(tài)變量記錄 Singleton 類的唯一實(shí)例 5 private static Singleton uniqueInstance; 6 // 私有構(gòu)造器,只有 Singleton 類內(nèi)部才可調(diào)用構(gòu)造器(創(chuàng)建實(shí)例) 7 private Singleton() { } 8 9 // 全局調(diào)用的靜態(tài)方法 10 public static Singleton getInstance() 11 { 12 if (uniqueInstance == null) 13 { 14 uniqueInstance = new Singleton(); 15 } 16 17 return uniqueInstance; 18 } 19 }?
2、餓漢模式
顧名思義, 一個(gè)人特別餓,一聽到說有東西吃,馬上將開始吃東西(加載類時(shí)就完成初始化)。
在加載時(shí)實(shí)例化,無需考慮多線程問題。優(yōu)點(diǎn)是線程安全且不用鎖,缺點(diǎn)是資源利用效率低。
1 // sealed : 使類無法被繼承 2 public sealed class Singleton 3 { 4 // static 在靜態(tài)初始化器(sttic initializ)中創(chuàng)建單間, 保證了線程安全 5 private static Singleton uniqueInstance = new Singleton(); 6 7 private Singleton() { } 8 // 提供全局接口 9 public static Singleton getInstance() 10 { 11 return uniqueInstance; 12 } 13 14 }?
?
3、懶漢模式
同樣顧名思義, 一個(gè)人特別懶,聽到人喊吃飯(加載類),過來坐到飯桌前玩手機(jī),非要等說開始吃飯才開吃(才實(shí)例化)。
延遲實(shí)例化, 需要通過 “雙重檢查加鎖” 檢查, 系統(tǒng)效率可以會(huì)低下。
1 // sealed : 使類無法被繼承 2 public sealed class Singleton 3 { 4 // static 在靜態(tài)初始化器(sttic initializ)中創(chuàng)建單間, 保證了線程安全 5 private static Singleton uniqueInstance = new Singleton(); 6 7 private Singleton() { } 8 9 public static Singleton getInstance() 10 { 11 return uniqueInstance; 12 } 13 14 } 15 16 // 不用 .net 提供的 Lazy 方法, 實(shí)現(xiàn)方法如下所示 17 public sealed class Singleton 18 { 19 private static Singleton uniqueInstance; 20 21 // 定一個(gè)標(biāo)識,確保線程同步 22 private static readonly object locker = new object(); 23 24 private Singleton() { } 25 26 public static Singleton getInstacne() 27 { 28 if (uniqueInstance == null) 29 { 30 lock(locker) // 加鎖, 第二個(gè)的線程在此處掛起 31 { 32 if (uniqueInstance == null) 33 { 34 uniqueInstance = new Singleton(); 35 } 36 } // 解鎖, 第二個(gè)線程進(jìn)入 37 } 38 39 return uniqueInstance; 40 }?
?以上是最近學(xué)習(xí)單例模式的總結(jié), 如有不對,請指教!
?
轉(zhuǎn)載于:https://www.cnblogs.com/yaolin1228/p/7733970.html
總結(jié)
以上是生活随笔為你收集整理的设计模式 (3) : 单例模式的几种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NIO通信了解
- 下一篇: ADO.NET复习总结(4)--访问Sq