您好,登錄后才能下訂單哦!
一.原因
面試的過程中被問到設計模式的問題,所以我就先從簡單的設計模式開始談談。
二.介紹
從“單例”字面意思上理解為——一個類只有一個實例,所以單例模式也就是保證一個類只有一個實例的一種實現(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)成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。