【24期】請(qǐng)你談?wù)剢卫J降膬?yōu)缺點(diǎn),注意事項(xiàng),使用場(chǎng)景
閱讀本文大概需要 4.2?分鐘。
來(lái)自:www.cnblogs.com/damsoft/
單例模式介紹:
比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中,這些配置數(shù)據(jù)由一個(gè)單例對(duì)象統(tǒng)一讀取,然后服務(wù)進(jìn)程中的其他對(duì)象再通過這個(gè)單例對(duì)象獲取這些配置信息。這種方式簡(jiǎn)化了在復(fù)雜環(huán)境下的配置管理。
單例模式實(shí)現(xiàn)思路:
一個(gè)類能返回對(duì)象一個(gè)引用(永遠(yuǎn)是同一個(gè))和一個(gè)獲得該實(shí)例的方法(必須是靜態(tài)方法,通常使用getInstance這個(gè)名稱);
調(diào)用這個(gè)方法時(shí),如果類持有的引用不為空就返回這個(gè)引用,如果類保持的引用為空就創(chuàng)建該類的實(shí)例并將實(shí)例的引用賦予該類保持的引用;
將該類的構(gòu)造函數(shù)定義為私有方法,這樣其他處的代碼就無(wú)法通過調(diào)用該類的構(gòu)造函數(shù)來(lái)實(shí)例化該類的對(duì)象,只有通過該類提供的靜態(tài)方法來(lái)得到該類的唯一實(shí)例。
需要注意的地方:
優(yōu)點(diǎn):
在單例模式中,活動(dòng)的單例只有一個(gè)實(shí)例,對(duì)單例類的所有實(shí)例化得到的都是相同的一個(gè)實(shí)例。這樣就 防止其它對(duì)象對(duì)自己的實(shí)例化,確保所有的對(duì)象都訪問一個(gè)實(shí)例
單例模式具有一定的伸縮性,類自己來(lái)控制實(shí)例化進(jìn)程,類就在改變實(shí)例化進(jìn)程上有相應(yīng)的伸縮性。
提供了對(duì)唯一實(shí)例的受控訪問。
由于在系統(tǒng)內(nèi)存中只存在一個(gè)對(duì)象,因此可以 節(jié)約系統(tǒng)資源,當(dāng) 需要頻繁創(chuàng)建和銷毀的對(duì)象時(shí)單例模式無(wú)疑可以提高系統(tǒng)的性能。
允許可變數(shù)目的實(shí)例。
避免對(duì)共享資源的多重占用。
缺點(diǎn):
不適用于變化的對(duì)象,如果同一類型的對(duì)象總是要在不同的用例場(chǎng)景發(fā)生變化,單例就會(huì)引起數(shù)據(jù)的錯(cuò)誤,不能保存彼此的狀態(tài)。
由于單利模式中沒有抽象層,因此單例類的擴(kuò)展有很大的困難。
單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。
濫用單例將帶來(lái)一些負(fù)面問題,如為了節(jié)省資源將數(shù)據(jù)庫(kù)連接池對(duì)象設(shè)計(jì)為的單例類,可能會(huì)導(dǎo)致共享連接池對(duì)象的程序過多而出現(xiàn)連接池溢出;如果實(shí)例化的對(duì)象長(zhǎng)時(shí)間不被利用,系統(tǒng)會(huì)認(rèn)為是垃圾而被回收,這將導(dǎo)致對(duì)象狀態(tài)的丟失。
使用注意事項(xiàng):
使用時(shí)不能用反射模式創(chuàng)建單例,否則會(huì)實(shí)例化一個(gè)新的對(duì)象
使用懶單例模式時(shí)注意線程安全問題
餓單例模式和懶單例模式構(gòu)造方法都是私有的,因而是不能被繼承的,有些單例模式可以被繼承(如登記式模式)
適用場(chǎng)景:
需要頻繁實(shí)例化然后銷毀的對(duì)象。
創(chuàng)建對(duì)象時(shí)耗時(shí)過多或者耗資源過多,但又經(jīng)常用到的對(duì)象。
有狀態(tài)的工具類對(duì)象。
-頻繁訪問數(shù)據(jù)庫(kù)或文件的對(duì)象。
資源共享的情況下,避免由于資源操作時(shí)導(dǎo)致的性能或損耗等。如上述中的日志文件,應(yīng)用配置。
控制資源的情況下,方便資源之間的互相通信。如線程池等。
應(yīng)用場(chǎng)景:
推薦閱讀:
【23期】請(qǐng)你談?wù)勱P(guān)于IO同步、異步、阻塞、非阻塞的區(qū)別
【22期】為什么需要消息隊(duì)列?使用消息隊(duì)列有什么好處?
【21期】你能說(shuō)說(shuō)Java中Comparable和Comparator的區(qū)別嗎
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?

