Head First設計模式之單例模式
一、定義
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。
- Singleton模式中的實例構造器可以設置為protected以允許子類派生。
- Singleton模式一般不要支持ICloneable接口,因為這可能會導致多個對象實例,與Singleton模式的初衷違背。
- Singleton模式一般不要支持序列化,因為這也有可能導致多個對象實例,同樣跟Singleton模式的初衷違背。
- Singleton模式只考慮到了對象創建的管理,并沒有考慮對象銷毀的管理。就支持垃圾回收的平臺和對象的開銷來講,我們一般沒必要對其銷毀進行特殊的管理。
二、結構

創建一個 SingleObject 類。SingleObject 類有它的私有構造函數和本身的一個靜態實例。
SingleObject 類提供了一個靜態方法,供外界獲取它的靜態實例。
三、適用場景
1、要求生產唯一序列號。
2、WEB 中的計數器,不用每次刷新都在數據庫里加一次,用單例先緩存起來。
3、創建的一個對象需要消耗的資源過多,比如 I/O 與數據庫的連接等。
四、優缺點
優點:
1、在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。
2、避免對資源的多重占用(比如寫文件操作)。
缺點:
沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化。
五、實現
單例模式的實現有多種方式
1、線程不安全
public sealed class Singleton { public int Count { get; set; } private static Singleton instance = null; public static Singleton Instance { get { if (instance == null) { instance = new Singleton(); } return instance; } } private Singleton() { Count = DateTime.Now.Millisecond; } } public class SimpleSingleton { private SimpleSingleton() { } public static readonly SimpleSingleton instance = new SimpleSingleton(); }
說明:SimpleSingleton是 Singleton 的簡化版,它利用.NET的特性寫的,其實和Singleton 一樣
2.線程安全
/// <summary> /// 單例-線程安全 /// </summary> public sealed class SafeSingleton { public int Count { get; set; } private static SafeSingleton instance = null; private static readonly object safeLock = new object(); public static SafeSingleton Instance { get { if (instance == null) { lock (safeLock) { if (instance == null) { instance = new SafeSingleton(); } } } return instance; } } private SafeSingleton() { Count = DateTime.Now.Millisecond; } }
3.單例測試
class Program { static void Main(string[] args) { SayName(); SayNewName(); Thread.Sleep(1000); } private static async Task SayName() { await Task.Run(() => { var s = Singleton.Instance; Console.WriteLine("count:" + s.Count); var s1 = SafeSingleton.Instance; Console.WriteLine("【safe】 count:" + s1.Count); }); } private static async Task SayNewName() { await Task.Run(() => { var s = Singleton.Instance; Console.WriteLine("new count:" + s.Count); var s1 = SafeSingleton.Instance; Console.WriteLine("【safe】 new count:" + s1.Count); }); } }
結果

4、單例模式的復用
代碼
/// <summary> /// 4、使用 C# 2.0 泛型來完成單例模式的重用 /// </summary> /// <typeparam name="T"></typeparam> public class SingletonProvider<T> where T : new() { SingletonProvider() { } public static T Instance { get { return SingletonCreator.instance; } } class SingletonCreator { static SingletonCreator() { } internal static readonly T instance = new T(); } } /// <summary> /// 4、業務類demo /// </summary> public class TestClass { private string _createdTimestamp; public TestClass() { _createdTimestamp = DateTime.Now.ToString(); } public void Write() { Console.WriteLine(_createdTimestamp); } } /// <summary> /// 4、范型單例示例 /// </summary> public class demo { private void dosomething() { SingletonProvider<TestClass>.Instance.Write(); } }
參考:
http://www.runoob.com/design-pattern/singleton-pattern.html
http://blog.csdn.net/dabian1987/article/details/6951652
http://blog.csdn.net/jiankunking/article/details/50867050
http://www.rzrgm.cn/kmsfan/p/4562323.html
http://www.rzrgm.cn/dreign/archive/2012/05/08/2490212.html(推薦)
歡迎閱讀本系列文章:Head First設計模式之目錄

浙公網安備 33010602011771號