單件模式

 1、基本概述設計模式

單件模式:確保一個類只有一個實例,並提供一個全局訪問點。安全

解析以下:ide

  1)首先,該Singleton的構造函數必須是私有的,以保證客戶程序不會經過new()操做產生一個實例,達到實現單例的目的;函數

  2)由於靜態變量的生命週期跟整個應用程序的生命週期是同樣的,因此能夠定義一個私有的靜態全局變量uniqueInstance來保存該類的惟一實例;性能

  3)必須提供一個全局函數訪問得到該實例。spa

以下圖結構說明圖:線程

 

2、詳細說明設計

單件模式的建立,有三種方式。code

  1. 使用經典方式,存在一個問題,當有多個線程同時訪問時,會建立多個實例,違反了單件的本意。
  2. 使用急切方式,若是應用程序老是建立並使用單件實例,或者在建立和運行時方面的負擔不太繁重,該方式可使用。它的初始化交由靜態構造函數實現,並能夠在運行時編譯。在這種模式下,無需本身解決線程安全性問題,CLR會給咱們解決。由此能夠看到這個類被加載時,會自動實例化這個類,而不用在第一次調用GetInstance()後才實例化出惟一的單例對象。
  3. 使用懶惰(雙重檢查加鎖)方式,首先檢查是否實例已經建立,若是還沒有建立,「才」進行同步。這樣一來,只有第一次會同步,同步中會再檢查是否實例已經建立。若是性能是你關心的重點,那麼這個作法能夠幫你大大地減小GetInstance()的時間耗費。

問:難道我不能建立一個類,把全部的方法和變量都定義爲靜態的,把類直接看成一個單件?對象

答:若是你的類自給自足,並且不依賴於複雜的初始化,那麼你能夠這麼作。可是,由於靜態初始化的控制權是在CLR手上,這麼作有可能致使混亂,特別是當有許多類牽涉其中的時候。這麼作經常會形成一些微妙的、不容易發現的和初始化的次序有關的bug。除非你有絕對的必要使用類的單件,不然仍是建議使用對象的單件,比較保險。

 

問:我仍是不瞭解爲什麼全局變量比單件模式差。

答:在.Net中,全局變量基本上就是對對象的靜態引用。在這樣的狀況下使用全局變量會有一些缺點,咱們已經提到了其中的一個,急切實例化VS延遲實例化。可是咱們要記住這個模式的目的,確保類只有一個實例並提供全局訪問。全局變量能夠提供全局訪問,可是不能確保只有一個實例。

3、代碼列表

public class Singleton
{
    //其餘有用的單件數據

    private Singleton()
    {
    }

    //方式一:經典方式
    /*private static Singleton uniqueInstance;
    public static Singleton GetInstance()
    {
        if (uniqueInstance == null)
        {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }*/

    //方式二:急切方式
    /*private static Singleton uniqueInstance = new Singleton();
    public static Singleton GetInstance()
    {
        return uniqueInstance;
    }*/

    //方式三:雙重檢查加鎖方式
    /*private static Singleton uniqueInstance;
    public static Singleton GetInstance()
    {
        if (uniqueInstance == null)
        {
            lock (uniqueInstance)
            {
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
        //Interlocked類爲多個線程共享的變量提供原子操做。
        //CompareExchange方法比較兩個對象是否相等,若是相等,則替換其中一個對象。
        //return Interlocked.CompareExchange(ref uniqueInstance, new Singleton(), null);
    }*/

    //其餘有用的單件方法
}
View Code

---------------------------------以上內容根據《Head First 設計模式》進行整理

相關文章
相關標籤/搜索