C#單例模式的實現再回顧
阿新 • • 發佈:2020-08-18
一、單例模式的實現以及標準
1、例項要是static型別,保證記憶體中只有一份copy
2、不能夠外部建立,也就是通過關鍵字private私有化建構函式
3、提供一個外部訪問方法GetInstance
4、無論何時必須考慮執行緒安全問題
二、懶漢模式
需要時才建立,因此稱作懶漢模式,程式碼示例如下:
public class Robot { private static Robot m_instance = null; private static readonly object obj = new object(); // close out initprivate Robot() { } public static Robot GetInstance() { if (m_instance == null) { lock (obj) { if (m_instance == null) { m_instance = new Robot(); } } }return m_instance; } public void SayHello() { System.Console.WriteLine("hello ,form singleton robot."); } }
lock是為了保證執行緒安全,第一個if是判斷是否需要建立,第二個是為了判斷在多執行緒的情況下是否需要建立
二、餓漢模式
在宣告的時候就建立,已經餓了,不管用不用,先建立,因此使用的時候效率會高一些,但一開始就佔了記憶體,因此省時費空間
private static readonly Robot m_instance = new Robot();
// close out init
private Robot() { }
public static Robot GetInstance()
{
return m_instance;
}
public void SayHello()
{
System.Console.WriteLine("hello ,form singleton robot.");
}
}
由於利用了靜態變數的特性,因此一開始就建立完成,程式執行中又不會修改,因此執行緒安全。
三、利用.net 4.0以後的lazy模板來實現懶漢模式,並且lazy模板自動執行緒安全
public class Robot { private static readonly Robot m_instance = new Lazy<Robot>(()=>new Robot()).Value; // close out init private Robot() { } public static Robot GetInstance() { return m_instance; } public void SayHello() { System.Console.WriteLine("hello ,form singleton robot."); } }
四、模板實現
如果還覺得麻煩,那麼好,可以試下一個模板
public abstract class Singleton<T> where T : class//,new() { private static T singleton = null; private static readonly object obj = new object(); protected Singleton(){} public static T GetInstance() { if (singleton == null) { lock (obj) { if (singleton == null) { singleton = (T)Activator.CreateInstance(typeof(T), true); } } } return singleton; } } public class Robot:Singleton<Robot> { private Robot() { } public void SayHello() { System.Console.WriteLine("hello ,form singleton robot."); } }
注意:子類中需要關閉建構函式。