C#單例類的實(shí)現(xiàn)方法
單例類保證一個(gè)類全局僅有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn),由于只能生成一個(gè)實(shí)例,因此我們必須把構(gòu)造函數(shù)設(shè)為私有函數(shù)以禁止他人創(chuàng)建實(shí)例。
實(shí)現(xiàn)1:懶漢式,線程不安全
該實(shí)現(xiàn)沒有額外開銷,不要求線程安全的情況下可以使用:
public class Singleton1
{
  private static Singleton1 instance = null;
  private Singleton1() { }
  public static Singleton1 Instance
  {
    get
    {
      if (instance == null)
      {
        instance = new Singleton1();
      }
      return instance;
    }
  }
}
實(shí)現(xiàn)2:懶漢式,線程安全
由于每次訪問單例類實(shí)例都會(huì)加鎖,而加鎖是一個(gè)非常耗時(shí)的操作,故不推薦使用:
public class Singleton2
{
  private readonly static object lockObj = new object();
  private static Singleton2 instance = null;
  private Singleton2() { }
  public static Singleton2 Instance
  {
    get
    {
      lock(lockObj)
      {
        if (instance == null)
        {
          instance = new Singleton2();
        }
      }
      return instance;
    }
  }
}
實(shí)現(xiàn)3:餓漢式,線程安全
寫法簡(jiǎn)單,線程安全,但構(gòu)造時(shí)機(jī)不是由程序員掌控的:
public class Singleton3
{
  private static Singleton3 instance = new Singleton3();
  private Singleton3() { }
  public static Singleton3 Instance { get { return instance; } }
  public static void Test()
  {
    Console.WriteLine("test");
  }
}
當(dāng).NET運(yùn)行時(shí)發(fā)現(xiàn)第一次使用Singleton3時(shí)會(huì)創(chuàng)建單例的實(shí)例,而不是在第一次調(diào)用Singleton3.Instance屬性時(shí)創(chuàng)建,如進(jìn)行以下操作:
Singleton3.Test();
實(shí)現(xiàn)4:懶漢式,雙重校驗(yàn)鎖
在實(shí)現(xiàn)2的基礎(chǔ)上進(jìn)行改進(jìn),只在第一次創(chuàng)建實(shí)例時(shí)加鎖,提高訪問性能:
public class Singleton4
{
  private readonly static object lockObj = new object();
  private static Singleton4 instance = null;
  private Singleton4() { }
  public static Singleton4 Instance
  {
    get
    {
      if (instance == null)
      {
        lock (lockObj)
        {
          if (instance == null)
          {
            instance = new Singleton4();
          }
        }
      }
      return instance;
    }
  }
}
實(shí)現(xiàn)5:懶漢式,內(nèi)部類
在方法3的基礎(chǔ)上進(jìn)行改進(jìn),確保只有訪問Singleton5.Instance屬性時(shí)才會(huì)構(gòu)造實(shí)例:
public class Singleton5
{
  class Nested 
  {
    internal static readonly Singleton5 instance = new Singleton5();
  }
  private Singleton5() { }
  public static Singleton5 Instance { get { return Nested.instance; } }
}
實(shí)現(xiàn)單例基類
通過單例基類,我們可以簡(jiǎn)單的通過繼承創(chuàng)建一個(gè)單例類,實(shí)現(xiàn)代碼復(fù)用:
// 由于單例基類不能實(shí)例化,故設(shè)計(jì)為抽象類
public abstract class Singleton<T> where T : class
{
  // 這里采用實(shí)現(xiàn)5的方案,實(shí)際可采用上述任意一種方案
  class Nested
  {
    // 創(chuàng)建模板類實(shí)例,參數(shù)2設(shè)為true表示支持私有構(gòu)造函數(shù)
    internal static readonly T instance = Activator.CreateInstance(typeof(T), true) as T;
  }
  private static T instance = null;
  public static T Instance { get { return Nested.instance; } }
}
使用方法如下:
class TestSingleton : Singleton<TestSingleton>
{
  // 將構(gòu)造函數(shù)私有化,防止外部通過new創(chuàng)建
  private TestSingleton() { }
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
 - 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10C#停止線程的方法
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
 


閱讀排行
- 1C語言 while語句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
 - 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-10C#中split用法實(shí)例總結(jié)
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 01-10delphi制作wav文件的方法
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 


