-
有一些對象我們只需要一個
例如
線程池
數(shù)據(jù)庫連接
緩存cache
對話框
注冊表
日志對象
打印機贮缅、顯卡等設(shè)備驅(qū)動程序的對象
-
單例模式
確保一個類只有一個實例, 并提供一個全局訪問點
有的情況下是直接初始化好這個實例, 有的情況下是延遲初始化這個實例, 這取決于這個對象是否是資源敏感型的
單例模式的類也可以是一般的類, 含有自己的數(shù)據(jù)和方法前计。 把一個一般的類變成單例很簡單, 見下面的幾種方法
-
單例模式的幾種實現(xiàn)
(1) 餓漢模式直接創(chuàng)建實例
public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return uniqueInstance; } // other useful methods here public String getDescription() { return "I'm a statically initialized Singleton!"; } }
(2) 不顧一切使用synchronized
public class Singleton { private static Singleton uniqueInstance; // other useful instance variables here private Singleton() { } public static synchronized Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } // other useful methods here public String getDescription() { return "I'm a thread safe Singleton!"; } }
(3) 雙鎖單例模式(在JDK1.5以后才可以用這種實現(xiàn), 并且實現(xiàn)略微有點復(fù)雜)
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getInstance() { if (uniqueInstance == null) { synchronized (Singleton.class) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
(4) 使用靜態(tài)內(nèi)部類Holder(懶漢模式下最推薦這種實現(xiàn))
public class Singleton { private static class SingletonHolder { private static Singleton singletonInstance = new Singleton(); } // other useful instance variables here private Singleton() { } public static synchronized Singleton getInstance() { return SingletonHolder.singletonInstance; } // other useful methods here public String getDescription() { return "I'm a inner class holder Singleton!"; } }
如果有兩個或以上的類加載器, 那么它們?nèi)绻技虞d了使用單例模式的類, 將會創(chuàng)建不同的實例, 所以這種情況下應(yīng)該自行使用一個類加載器
-
輕易不要使用子類繼承單例類的形式蟋滴。 因為單例類的構(gòu)造器是私有的, 而子類要繼承的話又必須要讓構(gòu)造器不能是私有的: 如果構(gòu)造器不是私有的, 那么說父類是一個單例的說法也就不成立了
所以, 不要使用這種形式稠肘。 如果想讓子類是單例, 直接把它變成單例就好, 反正實現(xiàn)也不復(fù)雜
-
Java中實現(xiàn)單例模式的三件套
私有構(gòu)造器
一個靜態(tài)變量
一個靜態(tài)方法
chapter05_獨一無二的對象——單例模式
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埠巨,“玉大人畔裕,你說我怎么就攤上這事」远” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵具练,是天一觀的道長乍构。 經(jīng)常有香客問我,道長扛点,這世上最難降的妖魔是什么哥遮? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮陵究,結(jié)果婚禮上眠饮,老公的妹妹穿的比我還像新娘扰路。我一直安慰自己侣肄,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布雨膨。 她就那樣靜靜地躺著松蒜,像睡著了一般扔茅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秸苗,一...
- 文/蒼蘭香墨 我猛地睜開眼璃诀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屯断?” 一聲冷哼從身側(cè)響起文虏,我...
- 正文 年R本政府宣布华匾,位于F島的核電站映琳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜘拉。R本人自食惡果不足惜萨西,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旭旭。 院中可真熱鬧谎脯,春花似錦、人聲如沸持寄。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽稍味。三九已至咸产,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仲闽,已是汗流浹背脑溢。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 前言 本文主要參考 那些年,我們一起寫過的“單例模式”搏恤。 何為單例模式违寿? 顧名思義,單例模式就是保證一個類僅有一個...
- 簡介 單例模式是一種常用的軟件設(shè)計模式熟空,其定義是單例對象的類只能允許一個實例存在藤巢。許多時候整個系統(tǒng)只需要擁有一個的...
- 單例:意思就是只有一個實例。單例模式確保某一個類只有一個實例息罗,而且自行實例化并向整個系統(tǒng)提供這個實例掂咒。這個類稱為單...
- 在高并行的代碼環(huán)境中,我們常常會碰到這樣的情況:多個線程同時訪問某一段代碼迈喉,產(chǎn)生資源競爭绍刮,導(dǎo)致程序異常。線程鎖可以...