1. 程式人生 > >C#單例模式的幾種實現方式

C#單例模式的幾種實現方式

文章總結自張波老師的視訊教程

單例模式

  • 動機(Motivation)

    • 在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個例項,才能確保它們的邏輯正確性、以及良好的效率。
    • 如何繞過常規的構造器,提供一種機制來保證一個類只有一個例項?
    • 這應該是類設計者的責任,而不是使用者的責任
  • 意圖(Intent)

    • 保證一個類僅有一個例項,並提供一個該例項的全域性訪問點。——《設計模式》GoF

簡單實現

public sealed class Singleton
{
    private static Singleton _instance = null;

    private Singleton()
    {

    }

    public static Singleton Instance
    {
        get { return _instance ?? (_instance = new Singleton()); }
    }
}

說明:

  • 對於執行緒來說不安全
  • 單執行緒中已滿足要求
  • 優點:
    • 由於例項是在 Instance 屬性方法內部建立的,因此類可以使用附加功能
    • 直到物件要求產生一個例項才執行例項化;這種方法稱為“惰性例項化”。惰性例項化避免了在應用程式啟動時例項化不必要的 singleton。

執行緒安全的

public sealed class Singleton
{
    private static Singleton _instance = null;
    private static readonly object Padlock = new object();

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            lock (Padlock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }

            }
            return _instance;
        }
    }
}

說明:

  • 同一個時刻加了鎖的那部分程式只有一個執行緒可以進入
  • 物件例項由最先進入的那個執行緒建立
  • 後來的執行緒在進入時(instence == null)為假,不會再去建立物件例項
  • 增加了額外的開銷,損失了效能

雙重鎖定

public sealed class Singleton
{
    private static Singleton _instance = null;
    private static readonly object Padlock = new object();

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (Padlock)
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }

                }
            }

            return _instance;
        }
    }
}

說明:

  • 多執行緒安全
  • 執行緒不是每次都加鎖
  • 允許例項化延遲到第一次訪問物件時發生

靜態初始化

public sealed class Singleton
{
    private static readonly Singleton _instance = null;

    static Singleton()
    {
        _instance = new Singleton();
    }

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

說明:

  • 依賴公共語言執行庫負責處理變數初始化
  • 公共靜態屬性為訪問例項提供了一個全域性訪問點
  • 對例項化機制的控制權較少(.NET代為實現)
  • 靜態初始化是在 .NET 中實現 Singleton 的首選方法

延遲初始化

public sealed class Singleton
{
    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    private class Nested
    {
        internal static readonly Singleton instance = null;
        static Nested()
        {
            instance = new Singleton();
        }
    }
}

說明:

  • 初始化工作由Nested類的一個靜態成員來完成,這樣就實現了延遲初始化

注意事項

  • Singleton模式中的例項構造器可以設定為protected以允許子類派生。
  • Singleton模式一般不要支援ICloneable介面,因為這可能會導致多個物件例項,與Singleton模式的初衷違背。
  • Singleton模式一般不要支援序列化,因為這也有可能導致多個物件例項,同樣與Singleton模式的初衷違背。
  • Singletom模式只考慮到了物件建立的管理,沒有考慮物件銷燬的管理。就支援垃圾回收的平臺和物件的開銷來講,我們一般沒有必要對其銷 毀進行特殊的管理。

總結

  • Singleton模式是限制而不是改進類的建立。
  • 理解和擴充套件Singleton模式的核心是“如何控制使用者使用new對一個類的構造器的任意呼叫”。
  • 可以很簡單的修改一個Singleton,使它有少數幾個例項,這樣做是允許的而且是有意義的。

相關推薦

模式實現方式

size ron jdk null singleton bsp 還要 一個 fin 1、餓漢式:靜態常量 特點:單例的實例被聲明成static和final變量了,在第一次加載類到內存中時就會初始化,所以會創建實例本身是線程安全的 public class Sin

Java模式實現方式

開始 名稱 常量 就是 多線程開發 靜態代碼塊 浪費 ack 多線程同步 在平時的工作、學員的學習以及面試過程中,單例模式作為一種常用的設計模式,會經常被面試官問到,甚至筆試會要求學員現場默寫,下面將會就單例模式的實現思路和幾種常見的實現方式進行簡單的分享。

Android 模式實現方式及簡析

一.定義: 確保某一個類只有一個例項,而且自行例項並向整個系統提供這個例項 二.使用場景: 避免產生過多的物件消耗過多的資源,或者某種型別的物件只應該有且只有一個。例如,建立一個物件需要消耗的資源過多,如訪問資料庫或者IO 資源。 三.實現單例模式的關鍵

c#模式實現方式

    //單例模式一,本模式具有多執行緒不安全性,可通過多執行緒鎖來實現功能     public class Class1     {         //(1)將建構函式定義為private         private Class1()         {  

高併發下最全執行緒安全的模式實現

為了節約系統資源,有時需要確保系統中某個類只有唯一一個例項,當這個唯一例項建立成功之後,我們無法再建立一個同類型的其他物件,所有的操作都只能基於這個唯一例項。 但是餓漢式單例類不能實現延遲載入,不管將來用不用始終佔據記憶體;懶漢式單例類執行緒安全控制煩瑣,而且效能受影響。可

模式6實現方式

一:餓漢式public class MyObject { // 立即載入方式==餓漢模式 private static MyObject myObject = new MyObject();

模式——六實現方式(懶漢、餓漢、雙重檢驗鎖、靜態內部類、列舉)

單例模式 單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不

Java 模式實現的差別

單例模式確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 思路是通過將該類的構造方法設為private,那麼在其他類中不能直接例項化該類。那麼為了得到該類的例項,需要有public的static方法來返回該類的例項。(之所以static是為了可以直接用

C++之智慧指標和普通指標模式實現

1  問題 實現c++的單例模式,這裡測試分別寫了通過智慧指標返回物件和普通返回指標     2  程式碼測試 include <iostream> #include <mutex> #include <m

模式寫法

遺憾 想象 develop 由於 tcl loader adr 希望 線程不安全 第一種(懶漢,線程不安全): Java代碼 public class Singleton { private static Singleton instance;

的三實現方式

In imp SQ span wrap 定制 bsp () import 一:類方法實現單例 class Mysql: __instance = None def __init__(self,host,port): self.ho

的兩實現方式、多個版本及利弊對照

        單例設計模式,顧明思議,只有一個例項,先交代重要一點,為防止外界對該類進行例項化,需要把類的建構函式宣告為私有的,這樣大家對原理理解更深入些。 1、餓漢式 餓漢模式單例程式碼,經典,可用,無需改進。 package com.sing

C++模式最優實現

單例模式,簡單來說就是整個程式中只允許這一個類存在一個例項化物件。 方法來自大佬博文【戳這裡】。文章分析了各類單例模式的實現,包括餓漢模式,懶漢模式的幾個版本。如果趕時間,想快速上手,看這裡就夠了。 Talk is cheap. Show the code. 【最優實現程式

模式建立方式

在建立單例模式的時候,如果單純的只考慮單例而不思考那樣做的話會產生什麼問題這樣是不嚴謹的,比如會發生執行緒安全問題,看了一些文章其中一篇寫得非常詳細有關單例模式的問題和效能比較,這篇文章http://blog.sina.com.cn/s/blog_62c7c3030100zw

python模式實現方法

1.方法1,程式執行過程中,某個類物件只有1個,該類物件的例項物件可以有無數個,根絕這點,讓類物件持有一個例項化物件,重寫類物件的__new__方法,始終返回持有的這個例項化物件,即可實現單例模式。 class Person1: _single = None

模式的多種實現方式

相對於第三種方式,這種方式是Singleton類被裝載了,instance不一定被初始化。因為SingletonHolder類沒有被主動使用,只有顯式通過呼叫getInstance方法時,才會顯式裝載SingletonHolder類,從而例項化instance。例如,如果例項化instance很消耗資源,我

模式6實現及利弊分析

[TOC] # 單例模式6種實現及利弊分析 單例模式三要素 - **私有的構造方法;** - **指向自己例項的私有靜態引用;** - **以自己例項為返回值的靜態的公有方法** ## **1.餓漢式** ```java public class Singleton { private

C#模式實現方式

文章總結自張波老師的視訊教程 單例模式 動機(Motivation) 在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個例項,才能確保它們的邏輯正確性、以及良好的效率。

模式實現方式

str 類加載 代碼 創建對象 stat 懶漢 導致 方法 不支持 1、懶漢式,線程不安全 是否 Lazy 初始化:是 是否多線程安全:否 實現難度:易 描述:這種方式是最基本的實現方式,這種實現最大的問題就是不支持多線程。因為沒有加鎖 synchronized,所以嚴格意

深入理解模式實現方式

前言 單例模式是一種很常用的設計模式,其定義是單例物件的類只允許有一個例項存在。在使用spring自動建立物件時預設就是單例的。 使用場景 需要頻繁的對物件進行建立與銷燬,如果工具類物件 一、餓漢式(靜態變數) public class Singleton1 { private st