Android 設(shè)計(jì)模式之 單例模式

作者:ivm

之前做android 項(xiàng)目時(shí)崔赌,用的最多的就是設(shè)計(jì)模式,就是單例模式耸别,用的時(shí)候健芭,心里總有些疑問(wèn)。今天呢秀姐,看了《Android 源碼設(shè)計(jì)模式 解析與實(shí)戰(zhàn)》慈迈,把自己的總結(jié)分享一下。

首先什么是單例模式省有?

單例模式:使用時(shí)痒留,單例的對(duì)象必須保證只有一個(gè)實(shí)例存在,不予許自由構(gòu)造對(duì)象蠢沿。

那么單例模式的使用場(chǎng)景有哪些伸头?

確保某個(gè)類(lèi)有且只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例

如何“單例”舷蟀?

1.構(gòu)造函數(shù)不對(duì)外開(kāi)放熊锭,一般為private 弧轧。

2.通過(guò)一個(gè)靜態(tài)方法或者枚舉返回單例類(lèi)對(duì)象。

3.確保單例類(lèi)的對(duì)象在反序列化時(shí)不會(huì)重新構(gòu)建對(duì)象碗殷。(下文會(huì)講)

4.確保單例類(lèi)對(duì)象有且只有一個(gè),尤其是多線程下速缨。

單例模式的分類(lèi)

1.餓漢式

餓漢式

2.懶漢式

懶漢式

懶漢式與餓漢式的區(qū)別:

懶漢式:實(shí)名一個(gè)靜態(tài)對(duì)象锌妻,并且在用戶第一次調(diào)用getInstance 時(shí)進(jìn)行初始化,優(yōu)點(diǎn):?jiǎn)卫挥性谑褂脮r(shí)才會(huì)被實(shí)例化旬牲,一定程度上節(jié)約了資源仿粹。缺點(diǎn):是第一次加載時(shí)需要及時(shí)進(jìn)行實(shí)例化,反應(yīng)稍慢原茅,最大的問(wèn)題是每次調(diào)用getInstance 都進(jìn)行同步吭历,造成不必要的同步開(kāi)銷(xiāo)。一般不建議這么用擂橘。

餓漢式:是在聲明靜態(tài)對(duì)象時(shí)就已經(jīng)初始化晌区。

3.Double Check Lock (DCL)實(shí)現(xiàn)單例

DCL

DCL ?介紹

DCL 在getInstance 方法中 對(duì)instance 進(jìn)行兩次判空:相信很多人對(duì)此都有些疑惑。為什么要判斷兩次通贞,第一個(gè)判空是為了避免不必要的同步朗若,第二層判斷是為了在null 情況下創(chuàng)建實(shí)例。instance=new Singleton(); 語(yǔ)句看起來(lái)是有代碼昌罩,單實(shí)際是一個(gè)原子操作哭懈,最終會(huì)被編譯成多條匯編指令,大致做了三件事:

1.給Singleton 分配內(nèi)存

2.調(diào)用Singleton 的構(gòu)造函數(shù)茎用,初始化成員字段

3.將instance 對(duì)象指向分配的內(nèi)存空間(此時(shí)instance 就不是null 了)

但是jdk 1.5 以后java 編譯器允許亂序執(zhí)行?遣总。所以執(zhí)行順序可能是1-3-2 或者 1-2-3.如果是前者先執(zhí)行3 的話 切換到其他線程,instance 此時(shí) 已經(jīng)是非空了轨功,此線程就會(huì)直接取走instance 旭斥,直接使用,這樣就回出錯(cuò)夯辖。DCL 失效琉预。解決方法 SUN 官方已經(jīng)給我們了。將instance 定義成 privatevolatilestatic Singleton instance =null: 即可

DCL 的優(yōu)點(diǎn)蒿褂,資源利用率高圆米,第一次執(zhí)行g(shù)etInstance 時(shí)才會(huì)被實(shí)例化,效率高啄栓。缺點(diǎn):第一次加載反應(yīng)慢娄帖,也由于java 內(nèi)存 模型的原因偶爾會(huì)失敗,在高并發(fā)環(huán)境下昙楚,有一定缺陷近速,雖然發(fā)生概率很小。(很常用)

4.靜態(tài)內(nèi)部類(lèi)單例模式

靜態(tài)內(nèi)部類(lèi)單例

加載singleton 類(lèi)時(shí)不會(huì)初始化instance 只有在調(diào)用getInstance 方法時(shí),才會(huì)導(dǎo)致instance 被初始化,這個(gè)方法不僅能夠確保線程安全削葱,也能夠保證 單例對(duì)象的唯一性,同時(shí)也延遲了單例的實(shí)例化奖亚,是推薦使用的單例模式實(shí)現(xiàn)方式。

5.枚舉單例

枚舉單例

它在任何情況下都是單例的析砸,也是最簡(jiǎn)單的昔字。在上述的幾種單例模式下,都會(huì)有一種情況首繁,它們會(huì)出現(xiàn)重新創(chuàng)建對(duì)象的情況作郭,那就是反序列化。

要杜絕單例對(duì)象在反序列化時(shí)重新生成對(duì)象弦疮,那么必須加入如下方法:

反序列話方法

但是枚舉就不必要加這個(gè)方法夹攒,因?yàn)榉葱蛄性捤膊粫?huì)生成新的實(shí)例。

6.使用容器模式實(shí)現(xiàn)單例

容器模式單例

將眾多單例模式類(lèi)型注入到一個(gè)統(tǒng)一的管理類(lèi)中胁塞,在使用時(shí)根據(jù)key 對(duì)應(yīng)類(lèi)型的對(duì)象咏尝。這種方式使得我們可以管理多種類(lèi)型的單例,并且在使用時(shí)可以通過(guò)統(tǒng)一的接口進(jìn)行獲取操作闲先,降低了用戶的使用成本状土,也對(duì)用戶隱藏了具體實(shí)現(xiàn),降低了耦合度伺糠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒙谓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子训桶,更是在濱河造成了極大的恐慌累驮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舵揭,死亡現(xiàn)場(chǎng)離奇詭異谤专,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)午绳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)置侍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拦焚,你說(shuō)我怎么就攤上這事蜡坊。” “怎么了赎败?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秕衙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我僵刮,道長(zhǎng)据忘,這世上最難降的妖魔是什么鹦牛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮勇吊,結(jié)果婚禮上曼追,老公的妹妹穿的比我還像新娘。我一直安慰自己萧福,他們只是感情好拉鹃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鲫忍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钥屈。 梳的紋絲不亂的頭發(fā)上悟民,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音篷就,去河邊找鬼射亏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竭业,可吹牛的內(nèi)容都是我干的智润。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼未辆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窟绷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起咐柜,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兼蜈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拙友,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體为狸,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芍碧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年疾呻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了择膝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筷凤。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畴博,死狀恐怖嫩海,靈堂內(nèi)的尸體忽然破棺而出菩掏,到底是詐尸還是另有隱情巢价,我是刑警寧澤捷兰,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布立叛,位于F島的核電站,受9級(jí)特大地震影響贡茅,放射性物質(zhì)發(fā)生泄漏秘蛇。R本人自食惡果不足惜其做,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赁还。 院中可真熱鬧妖泄,春花似錦、人聲如沸艘策。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朋蔫。三九已至罚渐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驯妄,已是汗流浹背荷并。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留青扔,地道東北人源织。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像微猖,于是被迫代替她去往敵國(guó)和親谈息。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容