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

1. 概述

\quad來(lái)開(kāi)新坑啦!(你為啥總開(kāi)坑不填)哈误,這次來(lái)鞏固下學(xué)習(xí)的設(shè)計(jì)模式相關(guān)的內(nèi)容蔓姚,如果內(nèi)容有誤或者有好的建議的請(qǐng)大家請(qǐng)?jiān)谠u(píng)論區(qū)留言。

2. 單例模式

首先來(lái)介紹一下設(shè)計(jì)模式中最簡(jiǎn)單的單例模式

2.1單例模式的意義

\quad那么什么是單例模式呢幸海?從字面意思來(lái)理解即可祟身,就是一個(gè)類(lèi)最多只有一個(gè)實(shí)例(對(duì)象),并且它提供了一個(gè)全局訪(fǎng)問(wèn)點(diǎn)物独。原理很簡(jiǎn)單袜硫,那么它一般用在什么地方呢?比如:
(1)正如其描述的一樣挡篓,在系統(tǒng)資源中只有一個(gè)的東西我們可以用單例模式來(lái)描述它婉陷,線(xiàn)程池、緩存和硬件設(shè)備等等.
(2)多個(gè)實(shí)例會(huì)造成沖突官研,結(jié)果不一致的情況下可以使用單例模式

2.2單例模式的類(lèi)圖結(jié)構(gòu)

Singleton
static uniqueInstance
private Singleton(), static getInstance()

\quad來(lái)說(shuō)明一下秽澳,這個(gè)Singleton代表類(lèi)名,他有一個(gè)私有的靜態(tài)實(shí)例的引用戏羽,它的構(gòu)造函數(shù)是私有的担神,它還有一個(gè)獲取內(nèi)部實(shí)例的公有靜態(tài)方法。
(1)靜態(tài)實(shí)例是為了保證全局性始花,私有修飾符是為了保證外部不會(huì)對(duì)唯一實(shí)例進(jìn)行修改
(2)私有的構(gòu)造函數(shù)是為了不讓外部new新的實(shí)例對(duì)象
(3)公有的獲取實(shí)例方法是為了給外部提供一個(gè)獲取唯一實(shí)例的窗口妄讯。

2.3 兩種方式與簡(jiǎn)單代碼實(shí)現(xiàn)

在寫(xiě)代碼之前還要說(shuō)明一下單例模式的兩種方式孩锡,根據(jù)實(shí)例化時(shí)機(jī)的不同可以分為餓漢模式懶漢模式
(1)所謂餓漢模式亥贸,即在單例類(lèi)被加載時(shí)即會(huì)實(shí)例化一個(gè)對(duì)象交給自己的引用躬窜。來(lái)直看看代碼吧:

public class Singleton{
    // 唯一實(shí)例
    private  static Singleton singletonInstance = new Singleton();
    // 私有構(gòu)造函數(shù)
    private Singleton(){}

    // 獲取實(shí)例的方法
    public static Singleton getSingletonInstance() {
        return singletonInstance;
    }
    // 類(lèi)的 其他方法
}

(2)懶漢模式則是在調(diào)用獲取實(shí)例方法之后才會(huì)生成實(shí)例,來(lái)看下代碼:在里面有一點(diǎn)需要十分注意炕置,那就是getSingletonInstance方法的同步鎖修飾符荣挨,這是為了防止在多線(xiàn)程調(diào)用同一事物中產(chǎn)生多個(gè)實(shí)例的手段,但是這樣會(huì)有一個(gè)問(wèn)題讹俊,就是系統(tǒng)資源消耗會(huì)有所增加垦沉。所以一般Java中多使用餓漢模式。

public class Singleton2{
    // 唯一實(shí)例
    private  static Singleton2 singletonInstance;
    // 私有構(gòu)造函數(shù)
    private Singleton2(){}

    // 獲取實(shí)例的方法
    public static synchronized Singleton2 getSingletonInstance() {
        if(singletonInstance == null)
        {
            singletonInstance = new Singleton2();
        }
        return singletonInstance;
    }
    // 類(lèi)的 其他方法
}

但是也是可以?xún)?yōu)化一下的仍劈,如下代碼:這種辦法叫做雙重檢查加鎖法厕倍,因?yàn)檫M(jìn)入同步區(qū)域后,只會(huì)有一個(gè)線(xiàn)程進(jìn)入這個(gè)區(qū)域贩疙,而且之后不會(huì)進(jìn)入同步區(qū)域讹弯,所以消耗會(huì)比上一種方法要好。

/**
 *
 *懶漢模式優(yōu)化
 *
 * */
class Singleton3{
    // 唯一實(shí)例
    private volatile static Singleton3 singletonInstance;
    // 私有構(gòu)造函數(shù)
    private Singleton3(){}

    // 獲取實(shí)例的方法
    public static synchronized Singleton3 getSingletonInstance() {
        if(singletonInstance == null)
        {
            synchronized (Singleton3.class)
            {
                if(singletonInstance == null)
                {
                    singletonInstance = new Singleton3();
                }
            }
        }
        return singletonInstance;
    }
    // 類(lèi)的 其他方法
}

2.4單例模式的優(yōu)點(diǎn)

(1)內(nèi)存中只有一個(gè)對(duì)象这溅,節(jié)省內(nèi)存空間
(2)避免頻繁的創(chuàng)建銷(xiāo)毀對(duì)象组民,提高性能
(3)避免對(duì)共享資源的多重占用
(4)可以全局訪(fǎng)問(wèn)

2.5單例模式的使用場(chǎng)景

(1)需要頻繁實(shí)例化然后銷(xiāo)毀實(shí)例的對(duì)象
(2)有狀態(tài)的工具類(lèi)對(duì)象
(3)創(chuàng)建復(fù)雜且消耗資源的對(duì)象
(4)頻繁訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)或者文件的對(duì)象

2.6注意事項(xiàng)

(1)只能使用單例類(lèi)提供的方法來(lái)實(shí)例化對(duì)象,不可以使用反射悲靴,不然會(huì)產(chǎn)生新的實(shí)例
(2)不要斷開(kāi)單例類(lèi)對(duì)象和單例類(lèi)靜態(tài)引用的操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臭胜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子癞尚,更是在濱河造成了極大的恐慌耸三,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浇揩,死亡現(xiàn)場(chǎng)離奇詭異仪壮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)胳徽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)积锅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人养盗,你說(shuō)我怎么就攤上這事缚陷。” “怎么了往核?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蹬跃,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我铆铆,道長(zhǎng)蝶缀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任薄货,我火速辦了婚禮翁都,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谅猾。我一直安慰自己柄慰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布税娜。 她就那樣靜靜地躺著坐搔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敬矩。 梳的紋絲不亂的頭發(fā)上概行,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音弧岳,去河邊找鬼凳忙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛禽炬,可吹牛的內(nèi)容都是我干的涧卵。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腹尖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柳恐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起热幔,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乐设,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后断凶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體伤提,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年认烁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肿男。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡却嗡,死狀恐怖舶沛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窗价,我是刑警寧澤如庭,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站撼港,受9級(jí)特大地震影響坪它,放射性物質(zhì)發(fā)生泄漏骤竹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一往毡、第九天 我趴在偏房一處隱蔽的房頂上張望蒙揣。 院中可真熱鬧,春花似錦开瞭、人聲如沸懒震。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)个扰。三九已至,卻和暖如春葱色,著一層夾襖步出監(jiān)牢的瞬間递宅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工冬筒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恐锣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓舞痰,卻偏偏與公主長(zhǎng)得像土榴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子响牛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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