定義:確保一個(gè)類只有一個(gè)實(shí)例卖宠,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例匪凡。
類型:創(chuàng)建類模式
類圖:
單例模式應(yīng)該是23種設(shè)計(jì)模式中最簡單的一種模式了基公。它有以下幾個(gè)要素:
- 私有的構(gòu)造方法
- 指向自己實(shí)例的私有靜態(tài)引用
- 以自己實(shí)例為返回值的靜態(tài)的公有的方法
單例模式根據(jù)實(shí)例化對象時(shí)機(jī)的不同分為兩種:一種是餓漢式單例酪耕,一種是懶漢式單例擦剑。
-
餓漢模式在單例類被加載的時(shí)候,就實(shí)例化一個(gè)對象交給自己的引用
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } }
-
懶漢模式在調(diào)用取得實(shí)例的方法時(shí)才會實(shí)例化對象
public class Singleton { private static Singleton singleton; private Singleton(){} public static synchronized Singleton getInstance(){ if(singleton==null){ singleton = new Singleton(); } return singleton; } }
單例模式的優(yōu)點(diǎn)
- 在內(nèi)存中只有一個(gè)對象,節(jié)省內(nèi)存空間;
- 避免頻繁的創(chuàng)建和銷毀對象官研,提高性能;
- 避免對共享資源的多重占用闯睹;
- 可以全局訪問戏羽;
適用場景:
- 需要頻繁實(shí)例化然后銷毀的對象。
- 創(chuàng)建對象時(shí)耗時(shí)過多或者耗資源過多楼吃,但又經(jīng)常用到的對象始花。
- 有狀態(tài)的工具類對象。
- 頻繁訪問數(shù)據(jù)庫或文件的對象孩锡。
- 以及其他我沒用過的所有要求只有一個(gè)對象的場景衙荐。
單例模式注意事項(xiàng):
- 只能使用單例類提供的方法得到單例對象,不要使用反射浮创,否則將會實(shí)例化一個(gè)新對象忧吟。
- 不要做斷開單例類對象與類中靜態(tài)引用的危險(xiǎn)操作。
- 多線程使用單例使用共享資源時(shí)斩披,注意線程安全問題溜族。