最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、 注冊式單例

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

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

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

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

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

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

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

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

  輸出結(jié)果:

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

相關(guān)文章

  • 使用Linq注意事項避免報錯的方法

    使用Linq注意事項避免報錯的方法

    這篇文章主要介紹了使用Linq注意事項避免報錯的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C# 并行和多線程編程——Task進(jìn)階知識

    C# 并行和多線程編程——Task進(jìn)階知識

    這篇文章主要介紹了C# 并行和多線程編程——Task進(jìn)階知識的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • XAML如何獲取元素的位置

    XAML如何獲取元素的位置

    這篇文章主要為大家詳細(xì)介紹了XAML如何獲取元素的位置,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#驗(yàn)證碼識別基礎(chǔ)方法實(shí)例分析

    C#驗(yàn)證碼識別基礎(chǔ)方法實(shí)例分析

    這篇文章主要介紹了C#驗(yàn)證碼識別基礎(chǔ)方法實(shí)例分析,較為詳細(xì)的總結(jié)了C#驗(yàn)證碼的實(shí)現(xiàn)思路及具體步驟,并對實(shí)現(xiàn)思路進(jìn)行了總結(jié)歸納,具有很好的實(shí)用價值,需要的朋友可以參考下
    2014-09-09
  • C#利用ms office實(shí)現(xiàn)office轉(zhuǎn)pdf的示例代碼

    C#利用ms office實(shí)現(xiàn)office轉(zhuǎn)pdf的示例代碼

    這篇文章主要介紹了C#利用ms office實(shí)現(xiàn)office轉(zhuǎn)pdf的詳細(xì)方法,文中通過代碼示例和圖文講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-09-09
  • C#操作LINQ to SQL組件進(jìn)行數(shù)據(jù)庫建模的基本教程

    C#操作LINQ to SQL組件進(jìn)行數(shù)據(jù)庫建模的基本教程

    這篇文章主要介紹了C#操作LINQ to SQL組件進(jìn)行數(shù)據(jù)庫建模的基本教程,LINQ to SQL被集成在.NET框架之中,需要的朋友可以參考下
    2016-03-03
  • C#異步編程由淺入深(三)之詳解Awaiter

    C#異步編程由淺入深(三)之詳解Awaiter

    這篇文章主要介紹了C#異步編程由淺入深(三)之詳解Awaiter,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C#生成帶注釋的dll并引用實(shí)現(xiàn)

    C#生成帶注釋的dll并引用實(shí)現(xiàn)

    本文主要介紹了C#生成帶注釋的dll并引用實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 基于C#實(shí)現(xiàn)屏幕取色器的示例詳解

    基于C#實(shí)現(xiàn)屏幕取色器的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)屏幕取色器,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • c#圖片添加水印的實(shí)例代碼

    c#圖片添加水印的實(shí)例代碼

    這篇文章介紹了c#圖片添加水印的實(shí)例代碼,有需要的朋友可以參考一下
    2013-07-07

最新評論

河东区| 章丘市| 灌云县| 萨迦县| 织金县| 凉城县| 临江市| 弋阳县| 仲巴县| 荔浦县| 曲周县| 淳安县| 梁山县| 太康县| 莲花县| 永春县| 漳浦县| 潼关县| 武汉市| 沭阳县| 顺昌县| 塘沽区| 平原县| 司法| 海晏县| 伊宁市| 太仓市| 绥德县| 岐山县| 雷州市| 梅州市| 高碑店市| 盈江县| 五寨县| 浑源县| 浪卡子县| 景东| 嘉义市| 蓬莱市| 太保市| 额敏县|