設(shè)計模式- 單例模式

  • 單例模式:
    保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
    為了解決兩個問題:
    • 全局訪問
    • 初始化控制
//簡單單例
class Singleton
{
    private static Singleton instance;
    private Singleton()
    {
    }
    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}
//客戶端代碼
static void Main(string[] args)
{   
    Singleton s1 = Singleton.GetInstance();
    Singleton s2 = Singleton.GetInstance();
    if(s1 == s2){
        Console.WriteLine("兩個對象是相同的實例");
    }
    Console.Read();
}
  • 多線程單例
    當多個線程同時訪問 Singleton 類的時候,會有可能創(chuàng)建出多個實例。這時就需要一把 lock 來確保當一個線程位于代碼的臨界區(qū)時,另一個線程不進入臨界區(qū)。如果其他線程試圖進入鎖定的代碼,那么它將一直等待,直到該對象被釋放。
//多線程單例
 class Singleton
 {
    private static Singleton instance;
    private static readonly object syncRoot = new object();
    private Singleton()
    {

    }
    //這樣做的缺點就是 每次創(chuàng)建的時候都需要 lock。
    // public static Singleton GetInstance()
    // {
    //  lock(syncRoot)
    //  {
    //      if(instance == null)
    //      {
    //          instance = new Singleton();
    //      }
    //  }
    //  return instance;
    // }
    //先判斷實例是否存在,不存在再加鎖處理
    public static Singleton GetInstance()
    {
        //判斷兩次實例是否為null 的道理在于,第一次判斷是為了避免頻繁加鎖
        /*第二次判斷是為了防止多線程多次創(chuàng)建實例當多個線程同時訪問的時候,會允許一個線程進去,當一個線程創(chuàng)建完對象之后,另一個線程進入如果不判斷非空的情況,那么也會出現(xiàn)重復(fù)創(chuàng)建的情況。*/
        if(instance == null){
            lock(syncRoot){
                if(instance == null)
                {
                    instance = new Singleton();
                }
            }
        }   
        return instance;
    }
}
  • C# 靜態(tài)初始化
//這種靜態(tài)初始化方式是在自己被加載的時候就將自己實例化,上面的在第一次被引用的時候才會將自己實例化,屬于懶加載。
public sealed class Singleton
{
    //在第一次引用類的任何成員時創(chuàng)建實例。公共語言運行庫負責(zé)處理變量初始化
    private static readonly Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton GetInstance()
    {
        return instance;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例模式(Singleton Pattern)是眾多設(shè)計模式中較為簡單的一個,同時它也是面試時經(jīng)常被提及的問題,如...
    廖少少閱讀 655評論 0 1
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,637評論 1 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,853評論 18 399
  • 在Java設(shè)計模式中,單例模式相對來說算是比較簡單的一種構(gòu)建模式。適用的場景在于:對于定義的一個類,在整個應(yīng)用程序...
    時待吾閱讀 283評論 0 0
  • 單例模式 單例模式有以下特點: 單例類只能有一個實例 單例類必須自己創(chuàng)建自己的唯一實例 單例類必須給所有其他對象提...
    Mr_不靠譜_先森閱讀 420評論 0 0

友情鏈接更多精彩內(nèi)容