程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 設計形式系列教程-單例形式

C# 設計形式系列教程-單例形式

編輯:C#入門知識

C# 設計形式系列教程-單例形式。本站提示廣大學習愛好者:(C# 設計形式系列教程-單例形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 設計形式系列教程-單例形式正文


1. 描寫:

  包管一個類唯一一個實例,並供給一個拜訪它的全局拜訪點。

2. 單例形式重要有3個特色,:

  2.1 單例類確保本身只要一個實例。
  2.2 單例類必需本身創立本身的實例。
  2.3 單例類必需為其他對象供給獨一的實例。

3. 完成方法:懶漢單例類和餓漢單例類

  3.1 懶漢式單例類
    關於懶漢形式,我們可以如許懂得:該單例類異常懶,只要在本身須要的時刻才會行為,歷來不曉得盡早做好預備。它在須要對象的時刻,才斷定能否已有對象,假如沒有就立刻創立一個對象,然後前往,假如已有對象就不再創立,立刻前往。
懶漢形式只在內部對象第一次要求實例的時刻才去創立。

  3.2 餓漢式單例
    關於餓漢形式,我們可以如許懂得:該單例類異常餓,急切須要吃器械,所以它在類加載的時刻就立刻創立對象。

  3.3 懶漢形式和餓漢形式的優缺陷:
    懶漢形式,它的特色是運轉時取得對象的速度比擬慢,但加載類的時刻比擬快。它在全部運用的性命周期只要一部門時光在占用資本。
    餓漢形式,它的特色是加載類的時刻比擬慢,但運轉時取得對象的速度比擬快。它從加載到運用停止會一向占用資本。
    這兩種形式關於初始化較快,占用資本少的輕量級對象來講,沒有多年夜的機能差別,選擇懶漢式照樣餓漢式都沒有成績。然則關於初始化慢,占用資本多的分量級對象來講,就會有比擬顯著的差異了。所以,對分量級對象運用餓漢形式,類加載時速度慢,但運轉時速度快;懶漢形式則與之相反,類加載時速度快,但運轉時第一次取得對象的速度慢。
    從用戶體驗的角度來講,我們應當首選餓漢形式。我們情願期待某個法式花較長的時光初始化,卻不愛好在法式運轉時期待太久,給人一種反響緩慢的感到,所以關於有分量級對象介入的單例形式,我們推舉應用餓漢形式。
    而關於初始化較快的輕量級對象來講,選用哪一種辦法都可以。假如一個運用中應用了年夜量單例形式,我們就應當衡量兩種辦法了。輕量級對象的單例采取懶漢形式,加重加載時的累贅,延長加載時光,進步加載效力;同時因為是輕量級對象,把這些對象的創立放在應用時停止,現實就是把創立單例對象所消費的時光分攤到全部運用中去了,關於全部運用的運轉效力沒有太年夜影響。

4. 代碼完成:

  4.1 懶漢式

  public class Singleton
  {
    private static Singleton m_Instance;

    private Singleton()
    {
      // 將默許結構函數界說為公有,避免內部挪用它實例化其余對象
    }

    public static Singleton GetInstance()
    {

      if (m_Instance == null)
      {
        m_Instance = new Singleton();
      }

      return m_Instance;
    }
  }

  4.2 餓漢式

  // 界說為sealed避免派生,由於派生能夠增長實例
  public sealed class Singleton
  {
    private static readonly Singleton m_Instance = new Singleton();
    private Singleton()
    {
      // 將默許結構函數界說為公有,避免內部挪用它實例化其余對象
    }

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

5. 形式總結

  5.1 長處:
    避免在運用法式中實例化多個對象。這就勤儉了開支,每一個實例都要占用必定的內存,創立對象時須要時光和空間。

  5.2 缺陷:

  5.3 實用場所:
    5.3.1 掌握資本的應用,經由過程線程同步來掌握資本的並發拜訪;
    5.3.2 掌握實例發生的數目,到達勤儉資本的目標。
    5.3.3 作為通訊序言應用,也就是數據同享,它可以在不樹立直接聯系關系的前提下,讓多個不相干的兩個線程或許過程之間完成通訊。

  5.4 對設計准繩的支撐:

    應用單例形式最焦點的一點是表現了面向對象封裝特征中的“單一職責”准繩。

6. 彌補: 在多線程開放進程中,對應用懶漢單例形式應避免兩個線程同時去實例化對象,這是有能夠的。

上面給出處理計劃

  6.1 應用鎖機制

  public class Singleton
  {
    private static Singleton m_Instance;

    static readonly object o = new object();

    private Singleton()
    {
      // 將默許結構函數界說為公有,避免內部挪用它實例化其余對象
    }

    public static Singleton GetInstance()
    {
      lock (o)
      {
        if (m_Instance == null)
        {
          m_Instance = new Singleton();
        }
      }

      return m_Instance;
    }
  }

  應用鎖機制可以避免兩個線程同時創立對象,但這裡有特性能成績,每當一個線程拜訪GetInstance()這個辦法是,都要加鎖,這實際上是沒需要的。

  6.2 兩重鎖定

  public class Singleton
  {
    private static Singleton m_Instance;

    static readonly object o = new object();

    private Singleton()
    {
      // 將默許結構函數界說為公有,避免內部挪用它實例化其余對象
    }

    public static Singleton GetInstance()
    {
      // 這裡增長了一個斷定實例能否存在,只要在不存在時才給加鎖,也就是在這個實例的性命周期中只加過一次鎖
      if (m_Instance == null)
      {
        lock (o)
        {
          if (m_Instance == null)
          {
            m_Instance = new Singleton();
          }
        }
      }

      return m_Instance;
    }
  }

  兩重鎖定包管了實例在它的性命周期中只被鎖定一次,因此它對機能不會有影響。

以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved