设计模式 (3) : 单例模式的几种方法
生活随笔
收集整理的這篇文章主要介紹了
设计模式 (3) : 单例模式的几种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
定義: 確保一個類只有一個實例, 并提供一個全局訪問點。
原理: c# 中用 new 方法創建一個實例需要調用類的構造函數(注: 每一個類都必須有至少一個構造函數, 當我們未定義構造函數時,編譯時編譯器會幫我們生成一個公有的無參數的構造函數。), 當構造函數私有(private) 時,在類外部無法創建創建類的實例。
常用的幾種實現方式:
1、只可在單線程下使用的實現
1 // 最簡單的單線程下的單例模式 2 public class Singleton 3 { 4 // 局部靜態變量記錄 Singleton 類的唯一實例 5 private static Singleton uniqueInstance; 6 // 私有構造器,只有 Singleton 類內部才可調用構造器(創建實例) 7 private Singleton() { } 8 9 // 全局調用的靜態方法 10 public static Singleton getInstance() 11 { 12 if (uniqueInstance == null) 13 { 14 uniqueInstance = new Singleton(); 15 } 16 17 return uniqueInstance; 18 } 19 }?
2、餓漢模式
顧名思義, 一個人特別餓,一聽到說有東西吃,馬上將開始吃東西(加載類時就完成初始化)。
在加載時實例化,無需考慮多線程問題。優點是線程安全且不用鎖,缺點是資源利用效率低。
1 // sealed : 使類無法被繼承 2 public sealed class Singleton 3 { 4 // static 在靜態初始化器(sttic initializ)中創建單間, 保證了線程安全 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、懶漢模式
同樣顧名思義, 一個人特別懶,聽到人喊吃飯(加載類),過來坐到飯桌前玩手機,非要等說開始吃飯才開吃(才實例化)。
延遲實例化, 需要通過 “雙重檢查加鎖” 檢查, 系統效率可以會低下。
1 // sealed : 使類無法被繼承 2 public sealed class Singleton 3 { 4 // static 在靜態初始化器(sttic initializ)中創建單間, 保證了線程安全 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 方法, 實現方法如下所示 17 public sealed class Singleton 18 { 19 private static Singleton uniqueInstance; 20 21 // 定一個標識,確保線程同步 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) // 加鎖, 第二個的線程在此處掛起 31 { 32 if (uniqueInstance == null) 33 { 34 uniqueInstance = new Singleton(); 35 } 36 } // 解鎖, 第二個線程進入 37 } 38 39 return uniqueInstance; 40 }?
?以上是最近學習單例模式的總結, 如有不對,請指教!
?
轉載于:https://www.cnblogs.com/yaolin1228/p/7733970.html
總結
以上是生活随笔為你收集整理的设计模式 (3) : 单例模式的几种方法的全部內容,希望文章能夠幫你解決所遇到的問題。