中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#怎樣實現單例模式

發布時間:2021-02-10 14:19:20 來源:億速云 閱讀:150 作者:小新 欄目:開發技術

小編給大家分享一下c#怎樣實現單例模式,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

  記一下學習單例模式的筆記:

  單例就是要保證該類僅有一個實例。實現完全封閉的單例(外部不能new)其實就要兩點要求:

  • 全局訪問:需要一個該類型的全局靜態變量,每次獲取實例時都要判斷它是否null,不存在new,存在通過一個方法直接返回該值獲取實例來保證對象唯一;

  • 實例化控制:new實例不能外部new、造成實例不唯一,需要一個私有構造器禁用共有構造器。

  根據new實例的時機,分為餓漢式和懶漢式:

一、 餓漢式單例:靜態變量初始化時new

  特點:加載時new,一開始全局就存在該唯一實例,每次用到只要獲取就行,提前占用系統資源但不存在線程安全問題。代碼如下:

public sealed class Singleton
  {
    private static readonly Singleton instance = new Singleton();
    private Singleton() { }

    public static Singleton GetInstance()
    {
      return instance;
    }
  }

二、 懶漢式單例:需要該實例的時候再new

  特點:真正需要用到的時候才實例化,不提前占用資源但多個線程同時用到該實例時,會存在判斷靜態變量都為null都去new而產生多個實例的情況。有線程安全問題,但可以用雙重鎖定解決。

  單線程懶漢單例代碼如下:

public class Singleton
  {
    private static Singleton instance = null;
    private Singleton() { }

    public static Singleton GetInstance()
    {
      if (instance == null)
        instance = new Singleton();
      return instance;
    }
  }

  多線程懶漢單例代碼如下:

public class Singleton
  {
    private static Singleton instance = null;
    private static readonly object obj = new object();
    private Singleton() { }

    public static Singleton GetInstance()
    {
      //雙重鎖定
      if (instance == null)//只有為null需要實例化處理時才進行加鎖,提高性能避免不必要的等待
      {
        lock (obj)
        {
          if (instance == null)//避免其他線程等待鎖釋放期間有線程已經實例化,從而造成多個實例
            instance = new Singleton();
        }
      }
      return instance;
    }
  }

三、 注冊式單例

  介紹一個有意思的單例-泛型注冊式,是對單例的擴展,主要了解它的設計思想。

  其實每個類單例模式實現代碼都是差不多的:

  1. 相同結構和成員(字段、屬性、行為等):是否可以考慮進行抽象提取一個公共的調用接口?

  2. 成員類型或輸入輸出具體類型不是固定的:是否可以考慮設計一個適用于不同類型的通用處理方式而不都是Object?這個適用不同類型通用解決就要用到泛型。

  實現代碼如下(例子使用餓漢式,當然也可以用懶漢式):

public abstract class Singleton<T> where T:class,new()
  {
    private static readonly T instance = new T();
    protected Singleton() { }

    public static T GetSingleton()//獲取單例
    {
      return instance;
    }
  }
  public class Person : Singleton<Person> { }

  可以看到這種單例通過繼承的方式,既可以new實例也可以獲取單例實例。如果要實現上面的完全封閉(禁用外部new),也可以完全在Person類中寫個私有構造器在Singleton<T>類中實例的獲取new T()改為反射調用私有構造器的方式實現,總感覺怪怪的。

  下面是主程序調用該單例方法:

static void Main(string[] args)
    {
      Person p1 = Person.GetSingleton();
      Person p2 = Singleton<Person>.GetSingleton();

      if (object.ReferenceEquals(p1, p2))
      {
        Console.WriteLine("兩個對象是同一實例");
      }
      Console.ReadKey();
    }

  輸出結果:

c#怎樣實現單例模式

看完了這篇文章,相信你對“c#怎樣實現單例模式”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

客服| 双江| 灵川县| 营山县| 志丹县| 玛曲县| 乐安县| 镇沅| 黄骅市| 七台河市| 娄烦县| 兴海县| 昭觉县| 常德市| 东台市| 吴忠市| 诏安县| 绥德县| 读书| 崇义县| 湾仔区| 安康市| 黑龙江省| 泽普县| 盐山县| 团风县| 龙陵县| 邹平县| 新邵县| 辉南县| 义乌市| 十堰市| 渝中区| 扎鲁特旗| 固始县| 秦安县| 喀喇| 湟中县| 徐闻县| 黔西县| 巫山县|