最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java設(shè)計模式之單例模式詳解

2020-03-29 10:46 作者:一枚猿  | 我要投稿

Java設(shè)計模式之單例模式詳解



什么是設(shè)計模式

設(shè)計模式是在大量的實踐中總結(jié)和理論之后優(yōu)選的代碼結(jié)構(gòu),編程風(fēng)格,以及解決問題的思考方式。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設(shè)計模式就像經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜,免去了我們自己再去思考和摸索的過程。



什么是單例模式

單例模式也叫單子模式,是一種常用的軟件設(shè)計模式,屬于創(chuàng)建型模式的一種。在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統(tǒng)只需要擁有一個的全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。比如在某個服務(wù)器程序中,該服務(wù)器的配置信息存放在一個文件中,這些配置數(shù)據(jù)由一個單例對象統(tǒng)一讀取,然后服務(wù)進(jìn)程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在復(fù)雜環(huán)境下的配置管理。

實現(xiàn)單例模式的思路是:一個類能返回對象一個引用(永遠(yuǎn)是同一個)和一個獲得該實例的方法(必須是靜態(tài)方法,通常使用getInstance這個名稱);當(dāng)我們調(diào)用這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就創(chuàng)建該類的實例并將實例的引用賦予該類保持的引用;同時我們還將該類的構(gòu)造構(gòu)造函數(shù)的訪問權(quán)限定義為private,這樣其他處的代碼就無法通過調(diào)用該類的構(gòu)造函數(shù)來實例化該類的對象,只有通過該類提供的靜態(tài)方法來得到該類的唯一實例。


單例模式在多線程的應(yīng)用場合下必須小心使用。如果當(dāng)唯一實例尚未創(chuàng)建時,有兩個線程同時調(diào)用創(chuàng)建方法,那么它們同時沒有檢測到唯一實例的存在,從而同時各自創(chuàng)建了一個實例,這樣就有兩個實例被構(gòu)造出來,從而違反了單例模式中實例唯一的原則。 解決這個問題的辦法是為指示類是否已經(jīng)實例化的變量提供一個互斥鎖(但是這樣會降低效率)。


單例模式又分為兩種:懶漢模式餓漢模式

懶漢模式:指全局的單例實例在第一次被使用時構(gòu)建。

餓漢模式:指全局的單例實例在類裝載時構(gòu)建。


下面分別來看看這兩種單例模式實現(xiàn)的步驟。


懶漢模式



上面的getInstance在多線程環(huán)境下是不能保證該對象的唯一性的。因此我們需要進(jìn)行調(diào)整一下,最后代碼如下:


餓漢模式:


餓漢模式VS懶漢模式


餓漢模式:

????壞處:對象加載時間過長。

????好處:餓漢模式是線程安全的。


懶漢模式:

????好處:延遲對象的創(chuàng)建。

????壞處:線程不安全,需要通過“雙重檢查鎖”來控制,因此代碼量比較多。


單例模式的優(yōu)點


單例模式因為是只生產(chǎn)一個對象,因此減少了系統(tǒng)性能的開銷,當(dāng)一個對象的產(chǎn)生需要消耗比較的資源時候,比如讀取配置文件,產(chǎn)生其他依賴對象時,則可通過再應(yīng)用啟動時直接產(chǎn)生一個單例對象,然后永久保存再內(nèi)存種的方式來解決。


單例模式的擴展


單例模式可擴展為有限的多例(Multitcm)模式,這種模式可生成有限個實例并保存在 ArmyList 中,客戶需要時可隨機獲取,其結(jié)構(gòu)圖如下圖所示。這種方式在連接數(shù)據(jù)的時候,創(chuàng)建多個connection的時候,經(jīng)常會用到,通過這種方式,就不需要頻繁的去連接和斷開數(shù)據(jù)庫了。




Java設(shè)計模式之單例模式詳解的評論 (共 條)

分享到微博請遵守國家法律
嵊州市| 广东省| 平果县| 巴彦县| 平泉县| 图木舒克市| 三门县| 黑水县| 城固县| 荃湾区| 五家渠市| 永顺县| 抚远县| 西宁市| 淮滨县| 拜城县| 云梦县| 怀柔区| 临泽县| 湖南省| 溧阳市| 盈江县| 徐州市| 弥渡县| 绥宁县| 永靖县| 海宁市| 息烽县| 河南省| 谢通门县| 灵川县| 永兴县| 延边| 饶平县| 江油市| 阳朔县| 沈阳市| 客服| 盈江县| 长治市| 凯里市|