c#設(shè)計(jì)模式-單例模式

一.原因

在保定等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè)公司,保定網(wǎng)站建設(shè)費(fèi)用合理。

面試的過(guò)程中被問(wèn)到設(shè)計(jì)模式的問(wèn)題,所以我就先從簡(jiǎn)單的設(shè)計(jì)模式開(kāi)始談?wù)劇?/p>

 

二.介紹

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

 

三.單例模式的應(yīng)用

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

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

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

四.實(shí)例

第一種最簡(jiǎn)單,但沒(méi)有考慮線程安全,在多線程時(shí)可能會(huì)出問(wèn)題,

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

 


 

第二種考慮了線程安全,不過(guò)有點(diǎn)煩,但絕對(duì)是正規(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#這樣的高級(jí)語(yǔ)言特有的,實(shí)在懶得出奇

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

使用Singleton模式有一個(gè)必要條件:在一個(gè)系統(tǒng)要求一個(gè)類只有一個(gè)實(shí)例時(shí)才應(yīng)當(dāng)使用單例模式。反過(guò)來(lái),如果一個(gè)類可以有幾個(gè)實(shí)例共存,就不要使用單例模式。

注意:

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

不要將數(shù)據(jù)庫(kù)連接做成單例,因?yàn)橐粋€(gè)系統(tǒng)可能會(huì)與數(shù)據(jù)庫(kù)有多個(gè)連接,并且在有連接池的情況下,應(yīng)當(dāng)盡可能及時(shí)釋放連接。Singleton模式由于使用靜態(tài)成員存儲(chǔ)類實(shí)例,所以可能會(huì)造成資源無(wú)法及時(shí)釋放,帶來(lái)問(wèn)題。

 

 

 

分享名稱:c#設(shè)計(jì)模式-單例模式
標(biāo)題URL:http://muchs.cn/article46/pidpeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)面包屑導(dǎo)航、企業(yè)建站Google、微信公眾號(hào)網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)