日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Design Pattern: Singleton 模式

發(fā)布時(shí)間:2025/5/22 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Design Pattern: Singleton 模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一句話概括:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。

Singleton的英文意義是獨(dú)身,也就是只有一個(gè)人,應(yīng)用在物件導(dǎo)向語(yǔ)言上,通常翻譯作單例:單一個(gè)實(shí)例(Instance)。?
很多時(shí)候,您會(huì)需要Singleton模式,例如印表機(jī)管理,您希望程式中只能有一個(gè)Print Spooler,以避免兩個(gè)列印動(dòng)作同時(shí)輸入至印表機(jī)中;例如資料庫(kù)管理,因?yàn)榻⑦B接(Connection)物件會(huì)耗用資源,您希望程式中只能有一個(gè) 連接物件,所有其它的程式都透過(guò)這個(gè)物件來(lái)連接資料庫(kù),以避免連接物件的重復(fù)開啟造成資源的耗用;例如系統(tǒng)程式屬性檔的讀取,您使用單一個(gè)物件來(lái)讀取屬性 內(nèi)容,而程式的其它部份都向這個(gè)物件要求屬性資料,而不是自行讀取屬性資料。?
以印表機(jī)設(shè)計(jì)為例,有的設(shè)計(jì)人員會(huì)采取全域變數(shù)的方式來(lái)建立實(shí)例,并在程式中隨機(jī)取用這個(gè)實(shí)例,Java雖然不支援全域變數(shù),但透過(guò)將物件包裝在一個(gè)類別之中,也有人會(huì)采用這樣的寫法:

public class PrintSpooler { public PrintSpooler() { // .... } public Connection getSpooler(){ .... } } public class GlobalObject { private PrintSpooler printSpooler; public GlobalObject () { printSpooler = new PrintSpooler(); ... } public void getPrintSpooler() { return printSpooler; } }

無(wú)論全域變數(shù)或是以上的例子,都無(wú)法保證只產(chǎn)生唯一個(gè)實(shí)例,您也許會(huì)注意不犯這個(gè)錯(cuò)誤,但與您共同工作的伙伴也許會(huì)直覺(jué)的使用建構(gòu)方法來(lái)產(chǎn)生一個(gè) PrintSpooler實(shí)例。?
Singleton模式可以保證一個(gè)類別只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)(visit)這個(gè)實(shí)例的方法。?
一個(gè)Singleton實(shí)作即為Java中的java.lang.Runtime類別,每個(gè)Java程式執(zhí)行時(shí)都有一個(gè)唯一的Runtime物件,可以透過(guò)它提供的靜態(tài)方法getRuntime()方法來(lái)取得這個(gè)物件,例如:

Runtime runtime = Runtime.getRuntime();

取得Runtime物件之后,您可以透過(guò)它進(jìn)行一些外部命令的執(zhí)行、進(jìn)行垃圾處理等等指令,您可以開啟Runtime.java類別,開頭的幾行是這樣寫的:

public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; } /** Don't let anyone else instantiate this class */ private Runtime() {} // 以下略 }

有幾個(gè)實(shí)作上面結(jié)構(gòu)的方法,可以在第一次需要實(shí)例時(shí)再建立物件,也就是采用所謂的Lazy Initialization:

public class Singleton { private static Singleton instance = null; private Singleton() { // .... } public static Singleton getInstance() { if (instance == null) {instance = new Singleton(); }return instance; } // .. 其它實(shí)作 }

上面的實(shí)作適用于單執(zhí)行緒的程式,在多執(zhí)行緒的程式下,以下的寫法在多個(gè)執(zhí)行緒的競(jìng)爭(zhēng)資源下,將仍有可能產(chǎn)生兩個(gè)以上的實(shí)例,例如下面的情況:

Thread1: if(instance == null) // true?
Thread2: if(instance == null) // true?
Thread1: instance = new Singleton(); // 產(chǎn)生一個(gè)實(shí)例?
Thread2: instance = new Singleton(); // 又產(chǎn)生一個(gè)實(shí)例?
Thread1: return instance; // 回傳一個(gè)實(shí)例?
Thread2: return instance; // 又回傳一個(gè)實(shí)例

在多執(zhí)行緒的環(huán)境下,為了避免資源同時(shí)競(jìng)爭(zhēng)而導(dǎo)致如上產(chǎn)生多個(gè)實(shí)例的情況,加上同步(synchronized)機(jī)制

public class Singleton {private static Singleton instance = null;private Singleton(){}synchronized static public Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }

不過(guò)這種簡(jiǎn)單的寫法不適合用于像伺服器這種服務(wù)很多執(zhí)行緒的程式上,同步機(jī)制會(huì)造成相當(dāng)?shù)男艿吐?#xff0c;為了顧及Singleton、Lazy Initialization與效能問(wèn)題,因而有了Double-check Locking的模式:

public class Singleton {private static Singleton instance = null;private Singleton(){}public static Singleton getInstance() {if (instance == null){synchronized(Singleton.class){if(instance == null) {instance = new Singleton();}}}return instance;} }

Java中Runtime類別的作法就簡(jiǎn)單多了,它舍棄了Lazy Initialization,如果您的實(shí)例初始化不是很久的話,可以用這種方式:

public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { // .... } public static Singleton getInstance() { return instance; } // 其它實(shí)作 }

Singleton本身的觀念簡(jiǎn)單但應(yīng)用很廣,因而很多時(shí)候必須對(duì)實(shí)際環(huán)境作一些考量與調(diào)整,建議您也看看有關(guān)于Singleton的這篇?討論。


總結(jié)

以上是生活随笔為你收集整理的Design Pattern: Singleton 模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。