亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c# 單例模式的實(shí)現(xiàn)

 更新時(shí)間:2021年02月06日 08:40:27   作者:JN-SHao  
這篇文章主要介紹了c# 單例模式的實(shí)現(xiàn)方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

  記一下學(xué)習(xí)單例模式的筆記:

  單例就是要保證該類僅有一個(gè)實(shí)例。實(shí)現(xiàn)完全封閉的單例(外部不能new)其實(shí)就要兩點(diǎn)要求:

  • 全局訪問(wèn):需要一個(gè)該類型的全局靜態(tài)變量,每次獲取實(shí)例時(shí)都要判斷它是否null,不存在new,存在通過(guò)一個(gè)方法直接返回該值獲取實(shí)例來(lái)保證對(duì)象唯一;
  • 實(shí)例化控制:new實(shí)例不能外部new、造成實(shí)例不唯一,需要一個(gè)私有構(gòu)造器禁用共有構(gòu)造器。

  根據(jù)new實(shí)例的時(shí)機(jī),分為餓漢式和懶漢式:

一、 餓漢式單例:靜態(tài)變量初始化時(shí)new

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

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

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

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

  特點(diǎn):真正需要用到的時(shí)候才實(shí)例化,不提前占用資源但多個(gè)線程同時(shí)用到該實(shí)例時(shí),會(huì)存在判斷靜態(tài)變量都為null都去new而產(chǎn)生多個(gè)實(shí)例的情況。有線程安全問(wèn)題,但可以用雙重鎖定解決。

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

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需要實(shí)例化處理時(shí)才進(jìn)行加鎖,提高性能避免不必要的等待
      {
        lock (obj)
        {
          if (instance == null)//避免其他線程等待鎖釋放期間有線程已經(jīng)實(shí)例化,從而造成多個(gè)實(shí)例
            instance = new Singleton();
        }
      }
      return instance;
    }
  }

三、 注冊(cè)式單例

  介紹一個(gè)有意思的單例-泛型注冊(cè)式,是對(duì)單例的擴(kuò)展,主要了解它的設(shè)計(jì)思想。

  其實(shí)每個(gè)類單例模式實(shí)現(xiàn)代碼都是差不多的:

  1. 相同結(jié)構(gòu)和成員(字段、屬性、行為等):是否可以考慮進(jìn)行抽象提取一個(gè)公共的調(diào)用接口?
  2. 成員類型或輸入輸出具體類型不是固定的:是否可以考慮設(shè)計(jì)一個(gè)適用于不同類型的通用處理方式而不都是Object?這個(gè)適用不同類型通用解決就要用到泛型。

  實(shí)現(xiàn)代碼如下(例子使用餓漢式,當(dāng)然也可以用懶漢式):

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> { }

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

  下面是主程序調(diào)用該單例方法:

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

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

  輸出結(jié)果:

以上就是c# 單例模式的實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于c# 單例模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#啟動(dòng)進(jìn)程的幾種常用方法

    C#啟動(dòng)進(jìn)程的幾種常用方法

    這篇文章主要介紹了C#啟動(dòng)進(jìn)程的幾種常用方法,實(shí)例分析了C#對(duì)系統(tǒng)進(jìn)行的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換

    C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換

    這篇文章介紹了C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • c# richtextbox更新大量數(shù)據(jù)不卡死的實(shí)現(xiàn)方式

    c# richtextbox更新大量數(shù)據(jù)不卡死的實(shí)現(xiàn)方式

    這篇文章主要介紹了c# richtextbox更新大量數(shù)據(jù)不卡死的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C# 判斷文件路徑的后綴

    C# 判斷文件路徑的后綴

    本文主要介紹了C# 判斷文件路徑的后綴,,通過(guò)解析文件名并檢查其擴(kuò)展名來(lái)判斷文件的后綴是否為.dcm,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • C#通過(guò)流寫入一行數(shù)據(jù)到文件的方法

    C#通過(guò)流寫入一行數(shù)據(jù)到文件的方法

    這篇文章主要介紹了C#通過(guò)流寫入一行數(shù)據(jù)到文件的方法,涉及C#針對(duì)文本文件讀寫的基本技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#對(duì)list列表進(jìn)行隨機(jī)排序的方法

    C#對(duì)list列表進(jìn)行隨機(jī)排序的方法

    這篇文章主要介紹了C#對(duì)list列表進(jìn)行隨機(jī)排序的方法,涉及C#操作list列表的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Unity 使用TexturePacker打包圖集的操作方法

    Unity 使用TexturePacker打包圖集的操作方法

    這篇文章主要介紹了Unity 使用TexturePacker打包圖集的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 輕松學(xué)習(xí)C#的運(yùn)算符

    輕松學(xué)習(xí)C#的運(yùn)算符

    輕松學(xué)習(xí)C#的運(yùn)算符,對(duì)C#的運(yùn)算符感興趣的朋友可以參考本篇文章,幫助大家更靈活的運(yùn)用C#的運(yùn)算符
    2015-11-11
  • implicit關(guān)鍵字做自定義類型隱式轉(zhuǎn)換的方法

    implicit關(guān)鍵字做自定義類型隱式轉(zhuǎn)換的方法

    implicit 關(guān)鍵字用于聲明隱式的用戶定義類型轉(zhuǎn)換運(yùn)算符。如果轉(zhuǎn)換過(guò)程可以確保不會(huì)造成數(shù)據(jù)丟失,則可使用該關(guān)鍵字在用戶定義類型和其他類型之間進(jìn)行隱式轉(zhuǎn)換,這篇文章就給大家詳細(xì)介紹implicit關(guān)鍵字做自定義類型隱式轉(zhuǎn)換的方法,需要的朋友可以參考下
    2015-08-08
  • C# dataset存放多張表的實(shí)例

    C# dataset存放多張表的實(shí)例

    這篇文章主要介紹了C# dataset存放多張表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01

最新評(píng)論