英文:Singleton
單例模式,它的定義就是確保某一個類只有一個實例涕俗,并且提供一個全局訪問點。
單例模式具備典型的3個特點:
? ? ? ? ?1崇棠、只有一個實例咽袜。?
? ? ? ? ?2丸卷、自我實例化枕稀。
? ? ? ? ?3、提供全局訪問點。
?因此當(dāng)系統(tǒng)中只需要一個實例對象或者系統(tǒng)中只允許一個公共訪問點萎坷,除了這個公共訪問點外凹联,不能通過其他訪問點訪問該實例時,可以使用單例模式哆档。
單例模式的主要優(yōu)點就是節(jié)約系統(tǒng)資源蔽挠、提高了系統(tǒng)效率,同時也能夠嚴格控制客戶對它的訪問瓜浸。也許就是因為系統(tǒng)中只有一個實例澳淑,這樣就導(dǎo)致了單例類的職責(zé)過重,違背了“單一職責(zé)原則”插佛,同時也沒有抽象類杠巡,所以擴展起來有一定的困難。其UML結(jié)構(gòu)圖非常簡單雇寇,就只有一個類氢拥,如下圖:
單例模式的概念:
單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例锨侯,而且自行實例化并向整個系統(tǒng)提供這個實例嫩海。這個類稱為單例類。
關(guān)鍵點:
? ? 1)一個類只有一個實例(這是最基本的)? ? ? ?
? ? 2)它必須自行創(chuàng)建這個實例
? ? 3)它必須自行向整個系統(tǒng)提供這個實例
兩種實現(xiàn)方式:
1? 懶漢模式(類加載時不初始化)
```
package Singleton;
public class LazySingleton {
? ? //懶漢式單例模式
? ? //比較懶囚痴,在類加載時叁怪,不創(chuàng)建實例,因此類加載速度快渡讼,但運行時獲取對象的速度慢
? ? private static LazySingleton intance = null;//靜態(tài)私用成員骂束,沒有初始化
? ? private LazySingleton()
? ? {
? ? ? ? //私有構(gòu)造函數(shù)
? ? }
? ? public static synchronized LazySingleton getInstance()? ? //靜態(tài),同步成箫,公開訪問點
? ? {
? ? ? ? if(intance == null)
? ? ? ? {
? ? ? ? ? ? intance = new LazySingleton();
? ? ? ? }
? ? ? ? return intance;
? ? }
}
```
package Singleton;
public class LazySingleton {
? ? //懶漢式單例模式
? ? //比較懶展箱,在類加載時,不創(chuàng)建實例蹬昌,因此類加載速度快混驰,但運行時獲取對象的速度慢
? ? private static LazySingleton intance = null;//靜態(tài)私用成員,沒有初始化
? ? private LazySingleton()
? ? {
? ? ? ? //私有構(gòu)造函數(shù)
? ? }
? ? public static synchronized LazySingleton getInstance()? ? //靜態(tài)皂贩,同步栖榨,公開訪問點
? ? {
? ? ? ? if(intance == null)
? ? ? ? {
? ? ? ? ? ? intance = new LazySingleton();
? ? ? ? }
? ? ? ? return intance;
? ? }
}
懶漢模式關(guān)鍵點:
1)私有構(gòu)造函數(shù)----不能在別的類中來獲取該類的對象,只能在類自身中得到自己的對象
2)成員變量為static的明刷,沒有初始化 ----類加載快婴栽,但訪問類的唯一實例慢,static保證在自身類中獲取自身對象
3)公開訪問點getInstance: public和synchronized的-----public保證對外公開辈末,同步保證多線程時的正確性(因為類變量不是在加載時初始化的)
2? 餓漢式單例模式(在類加載時就完成了初始化愚争,所以類加載較慢映皆,但獲取對象的速度快)
package Singleton;
public class EagerSingleton {
? ? //餓漢單例模式
? ? //在類加載時就完成了初始化,所以類加載較慢轰枝,但獲取對象的速度快
? ? private static EagerSingleton instance = new EagerSingleton();//靜態(tài)私有成員捅彻,已初始化
? ? private EagerSingleton()
? ? {
? ? ? ? //私有構(gòu)造函數(shù)
? ? }
? ? public static EagerSingleton getInstance()? ? //靜態(tài),不用同步(類加載時已初始化鞍陨,不會有多線程的問題)
? ? {
? ? ? ? return instance;
? ? }
}
餓漢式關(guān)鍵點:
1)私有構(gòu)造函數(shù)
2)靜態(tài)私有成員--在類加載時已初始化
3)公開訪問點getInstance-----不需要同步步淹,因為在類加載時已經(jīng)初始化完畢,也不需要判斷null诚撵,直接返回