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

