新聞中心
一.原因
面試的過程中被問到設(shè)計模式的問題,所以我就先從簡單的設(shè)計模式開始談談。
二.介紹
從“單例”字面意思上理解為——一個類只有一個實例,所以單例模式也就是保證一個類只有一個實例的一種實現(xiàn)方法罷了(設(shè)計模式其實就是幫助我們解決實際開發(fā)過程中的方法, 該方法是為了降低對象之間的耦合度,然而解決方法有很多種,所以前人就總結(jié)了一些常用的解決方法為書籍,從而把這本書就稱為設(shè)計模式),下面給出單例模式的一個百度百科的定義:單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例。即一個類只有一個對象實例。
三.單例模式的應用
在我們?nèi)粘J褂玫脑赪indows中也有不少單例模式設(shè)計的組件,象常用的文件管理器。由于Windows操作系統(tǒng)是一個典型的多進程多線程系統(tǒng),那么在創(chuàng)建或者刪除某個文件的時候,就不可避免地出現(xiàn)多個進程或線程同時操作一個文件的現(xiàn)象。采用單例模式設(shè)計的文件管理器就可以完美的解決這個問題,所有的文件操作都必須通過唯一的實例進行,這樣就不會產(chǎn)生混亂的現(xiàn)象。
再比如,每臺計算機可以有若干個打印機,如果每一個進程或者線程都獨立地使用打印機資源的話,那么我們打印出來的結(jié)果就有可能既包含這個打印任務的一部分,又包含另外一個打印任務的一部分。所以,大多數(shù)的操作系統(tǒng)最終為打印任務設(shè)計了一個單例模式的假脫機服務Printer Spooler,所有的打印任務都需要通過假脫機服務進行。
實際上,配置信息類、管理類、控制類、門面類、代理類通常被設(shè)計為單例類。像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)成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。
分享文章:c#設(shè)計模式-單例模式-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://fisionsoft.com.cn/article/diposj.html