溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#設計模式-單例模式

發(fā)布時間:2020-07-03 05:04:17 來源:網(wǎng)絡 閱讀:1045 作者:老楊紀事 欄目:編程語言

一.原因

面試的過程中被問到設計模式的問題,所以我就先從簡單的設計模式開始談談。

 

二.介紹

從“單例”字面意思上理解為——一個類只有一個實例,所以單例模式也就是保證一個類只有一個實例的一種實現(xiàn)方法罷了(設計模式其實就是幫助我們解決實際開發(fā)過程中的方法, 該方法是為了降低對象之間的耦合度,然而解決方法有很多種,所以前人就總結了一些常用的解決方法為書籍,從而把這本書就稱為設計模式),下面給出單例模式的一個百度百科的定義:單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例。即一個類只有一個對象實例。

 

三.單例模式的應用

在我們?nèi)粘J褂玫脑赪indows中也有不少單例模式設計的組件,象常用的文件管理器。由于Windows操作系統(tǒng)是一個典型的多進程多線程系統(tǒng),那么在創(chuàng)建或者刪除某個文件的時候,就不可避免地出現(xiàn)多個進程或線程同時操作一個文件的現(xiàn)象。采用單例模式設計的文件管理器就可以完美的解決這個問題,所有的文件操作都必須通過唯一的實例進行,這樣就不會產(chǎn)生混亂的現(xiàn)象。

再比如,每臺計算機可以有若干個打印機,如果每一個進程或者線程都獨立地使用打印機資源的話,那么我們打印出來的結果就有可能既包含這個打印任務的一部分,又包含另外一個打印任務的一部分。所以,大多數(shù)的操作系統(tǒng)最終為打印任務設計了一個單例模式的假脫機服務Printer Spooler,所有的打印任務都需要通過假脫機服務進行。

實際上,配置信息類、管理類、控制類、門面類、代理類通常被設計為單例類。像Java的Struts、spring框架,.Net的Spring.NET框架,以及PHP的Zend框架都大量使用了單例模式。

四.實例

第一種最簡單,但沒有考慮線程安全,在多線程時可能會出問題,

public class Singleton
{
    private static Singleton _instance = null;
    private Singleton(){}
    public static Singleton CreateInstance()
    {
        if(_instance == null)
        {
            _instance = new Singleton();
        }
        return _instance;
    }
}

 


 

第二種考慮了線程安全,不過有點煩,但絕對是正規(guī)寫法,經(jīng)典的一叉 

public class Singleton
{
    private volatile static Singleton _instance = null;
    private static readonly object lockHelper = new object();
    private Singleton(){}
    public static Singleton CreateInstance()
    {
        if(_instance == null)
        {
            lock(lockHelper)
            {
                if(_instance == null)
                     _instance = new Singleton();
            }

        }

        return _instance;
    }

}



第三種可能是C#這樣的高級語言特有的,實在懶得出奇

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

使用Singleton模式有一個必要條件:在一個系統(tǒng)要求一個類只有一個實例時才應當使用單例模式。反過來,如果一個類可以有幾個實例共存,就不要使用單例模式。

注意:

不要使用單例模式存取全局變量。這違背了單例模式的用意,最好放到對應類的靜態(tài)成員中。

不要將數(shù)據(jù)庫連接做成單例,因為一個系統(tǒng)可能會與數(shù)據(jù)庫有多個連接,并且在有連接池的情況下,應當盡可能及時釋放連接。Singleton模式由于使用靜態(tài)成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。

 

 

 

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI