成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

我的Java設(shè)計(jì)模式-單例模式

Jensen / 3319人閱讀

摘要:那有什么辦法保證只有一個(gè)領(lǐng)導(dǎo)人斯大林呢較常見的兩種方式餓漢式和懶漢式二實(shí)戰(zhàn)圖這里提示一點(diǎn),在學(xué)習(xí)設(shè)計(jì)模式的時(shí)候,圖會(huì)讓你更容易,而且深刻的去理解到該模式的核心。下一篇的設(shè)計(jì)模式是工廠方法模式。

??就算不懂設(shè)計(jì)模式的兄弟姐妹們,想必也聽說過單例模式,并且在項(xiàng)目中也會(huì)用上。但是,真正理解和熟悉單例模式的人有幾個(gè)呢?接下來我們一起來學(xué)習(xí)設(shè)計(jì)模式中最簡(jiǎn)單的模式之一——單例模式

一、為什么叫單例模式?

??“baby,你就是我的唯一,兩個(gè)世界都變形,回去談何容易...”??瓤葉就先唱到這吧,入正題。每次提起單例模式,筆者都會(huì)哼起這首王力宏的《唯一》。為什么?這首歌哪里吸引我了?就是“唯一”這兩個(gè)非常有糞量的字。

斯大林時(shí)期的蘇聯(lián),個(gè)人崇拜達(dá)到相當(dāng)嚴(yán)重的程度。然而為什么會(huì)導(dǎo)致個(gè)人崇拜呢?很簡(jiǎn)單,那就是“只有一個(gè)斯大林,只有一個(gè)領(lǐng)導(dǎo)人”!不允許出現(xiàn)兩個(gè)或者多個(gè)領(lǐng)導(dǎo)人,國(guó)家政務(wù)、外交等等大事小事都需要斯大林來發(fā)號(hào)施令。

定義

??保證一個(gè)類只有一個(gè)實(shí)例,并且整個(gè)系統(tǒng)能訪問該實(shí)例。

特點(diǎn)

單例類保證只有一個(gè)實(shí)例

單例類必須自己創(chuàng)建自己的唯一實(shí)例

單例類提供給系統(tǒng)提供該唯一實(shí)例

單例的定義也就是這么簡(jiǎn)單,還不明白?直白點(diǎn)就是該類只能new一個(gè)對(duì)象,不允許new第二個(gè)對(duì)象,而系統(tǒng)訪問的就是該對(duì)象。
那有什么辦法保證只有一個(gè)領(lǐng)導(dǎo)人斯大林呢?較常見的兩種方式:餓漢式懶漢式

二、實(shí)戰(zhàn) UML圖

這里提示一點(diǎn),在學(xué)習(xí)設(shè)計(jì)模式的時(shí)候,UML圖會(huì)讓你更容易,而且深刻的去理解到該模式的核心。況且,UML圖也是成為項(xiàng)目管理者必備的技能。

上代碼

如何確保一個(gè)系統(tǒng)只產(chǎn)生一個(gè)實(shí)例?這里必須使用private修飾構(gòu)造函數(shù),并且在構(gòu)造函數(shù)里邊實(shí)例化。

前面提到了單例模式比較常見的兩種方式:餓漢式懶漢式。下面我們來具體看看到底有多餓,以及到底有多懶!

1、餓漢式

首先,來看一下餓漢式單例模式。

餓漢式單例代碼如下:

public class EagerSingleton {

    private static EagerSingleton singleton = new EagerSingleton();

    private EagerSingleton() {
    } 

    public static EagerSingleton getSingleton() {
        return singleton;
    }
}

??注意,這里獲取實(shí)例必須使用靜態(tài)方法,要不然類外部無法訪問通過該方法得到唯一實(shí)例。

“餓漢式”顧名思義,已經(jīng)等不及外部需要用到的時(shí)候才實(shí)例化,于是在裝載類的時(shí)候就創(chuàng)建對(duì)象實(shí)例,一個(gè)自力更生的好榜樣~

餓漢式單例存在的問題主要是:既然在初始化的時(shí)候就已經(jīng)裝載類,必然會(huì)消耗內(nèi)存。

2、懶漢式

懶漢式單例代碼如下:

public class LazySingleton {

    private static LazySingleton singleton = null;

    private LazySingleton() {
    }

    public static synchronized LazySingleton getSingleton() {
        if (instance == null) {
            singleton = new LazySingleton();
        }
        return singleton;
    }
}

??這里使用了synchronized進(jìn)行同步,以保證線程安全

“懶漢式”的定義也容易理解,因?yàn)閼?,所以?dāng)需要使用到該實(shí)例的時(shí)候才去創(chuàng)建對(duì)象實(shí)例,在此之前不對(duì)類進(jìn)行實(shí)例化。

懶漢式單例主要問題:由于它的實(shí)現(xiàn)是線程安全的,會(huì)降低對(duì)實(shí)例的訪問速度,并且每次都需要進(jìn)行判斷。

??來到這的時(shí)候,既然上面兩個(gè)方式的單例都存在著問題,那有沒有一種方式,既能保證性能受到的影響小,并且可以保證線程安全的呢?網(wǎng)上很多現(xiàn)有的資源都提及到雙重檢查加鎖,在我第一次看到這東西的時(shí)候就覺得名字都很麻煩,實(shí)際上它的實(shí)現(xiàn)也比較麻煩,還有就是volatile關(guān)鍵字對(duì)性能有所影響,因此不推薦使用,這里也不做介紹了。當(dāng)然,選擇哪一種方式是根據(jù)個(gè)人實(shí)際項(xiàng)目的情況來選用的。

先別著急走,接下來登場(chǎng)的是比較完美的實(shí)現(xiàn)單例模式的方式枚舉單例

3、枚舉單例

老規(guī)矩,先上代碼:

public enum Singleton {

    singleton;

    public void singletonFunc() { // 該單例需要實(shí)現(xiàn)的功能
    }

}

??是不是很簡(jiǎn)單?而且因?yàn)樽詣?dòng)序列化機(jī)制,保證了線程的絕對(duì)安全。三個(gè)詞概括該方式:簡(jiǎn)單、高效、安全

三、總結(jié)

??好了,設(shè)計(jì)模式系列的第一篇到這就結(jié)束了。大家覺得哪里需要改進(jìn),或者是需要筆者提供支持的可以下邊留言。剛開始的模式大家都比較容易理解,接下來才是重頭戲。下一篇的設(shè)計(jì)模式是:工廠方法模式。

設(shè)計(jì)模式Java源碼GitHub下載:https://github.com/jetLee92/DesignPattern

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67901.html

相關(guān)文章

  • 深入理解單例模式

    摘要:總結(jié)我們主要介紹到了以下幾種方式實(shí)現(xiàn)單例模式餓漢方式線程安全懶漢式非線程安全和關(guān)鍵字線程安全版本懶漢式雙重檢查加鎖版本枚舉方式參考設(shè)計(jì)模式中文版第二版設(shè)計(jì)模式深入理解單例模式我是一個(gè)以架構(gòu)師為年之內(nèi)目標(biāo)的小小白。 初遇設(shè)計(jì)模式在上個(gè)寒假,當(dāng)時(shí)把每個(gè)設(shè)計(jì)模式過了一遍,對(duì)設(shè)計(jì)模式有了一個(gè)最初級(jí)的了解。這個(gè)學(xué)期借了幾本設(shè)計(jì)模式的書籍看,聽了老師的設(shè)計(jì)模式課,對(duì)設(shè)計(jì)模式算是有個(gè)更進(jìn)一步的認(rèn)識(shí)。...

    FuisonDesign 評(píng)論0 收藏0
  • 求職準(zhǔn)備 - 收藏集 - 掘金

    摘要:一基礎(chǔ)接口的意義百度規(guī)范擴(kuò)展回調(diào)抽象類的意義想不想通過一線互聯(lián)網(wǎng)公司面試文檔整理為電子書掘金簡(jiǎn)介谷歌求職記我花了八個(gè)月準(zhǔn)備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對(duì)象深入分析 Java 中實(shí)例變量和類變量的區(qū)別 - 掘金原創(chuàng)文章,轉(zhuǎn)載請(qǐng)務(wù)必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問我的站點(diǎn),閱讀更多有深度的文章。 實(shí)例變量 和 類變量...

    cuieney 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式---單例模式

    摘要:?jiǎn)卫J降膸追N實(shí)現(xiàn)方法具體如下懶漢模式優(yōu)點(diǎn)可以延遲加載缺點(diǎn)多線程不安全餓漢模式優(yōu)點(diǎn)多線程安全缺點(diǎn)加載類時(shí)就初始化完成無法延時(shí)加載雙重檢查優(yōu)點(diǎn)多線程安全延遲加載缺點(diǎn)同步耗時(shí)靜態(tài)內(nèi)部類優(yōu)點(diǎn)多線程安全延遲加載耗時(shí)短與雙重檢查相比用緩存實(shí)現(xiàn)優(yōu) showImg(http://7xjhi6.com1.z0.glb.clouddn.com/Java-Design-Patterns-Logo.png)...

    klivitamJ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<