單例模式(Singleton Pattern)是最簡單德設(shè)計模式巾钉,屬于創(chuàng)建型模式惭笑,提供了一種創(chuàng)建對象的最佳方式汞斧。
這種模式涉及到一個單一的類滔驶,該類負(fù)責(zé)創(chuàng)建自己的對象遇革,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式揭糕。
意圖
保證一個類僅有一個實例萝快,并提供一個訪問它的全局訪問點(diǎn)。
通常在需要控制實例數(shù)目著角,節(jié)省資源揪漩,避免頻繁創(chuàng)建銷毀的情況下使用。
優(yōu)點(diǎn)
只有一個實例雇寇,減少了內(nèi)存的開銷氢拥,尤其是頻繁的創(chuàng)建和銷毀實例,避免對資源的多重占用锨侯。
缺點(diǎn)
沒有接口嫩海,不能繼承,與單一職責(zé)原則沖突囚痴。
使用場景
設(shè)備管理器叁怪,計數(shù)器, I/O 與數(shù)據(jù)庫的連接等深滚。
實現(xiàn)
關(guān)鍵代碼:構(gòu)造函數(shù)是私有的奕谭。
- 懶漢式
class Singleton private constructor() {
companion object {
private lateinit var instance: Singleton
@Synchronized fun getInstance(): Singletion {
if (instance == null) {
instance = Singleton()
}
return instance
}
}
}
- 餓漢式
class Singleton private constructor() {
companion object {
private val instance = Singleton()
}
}
- 雙檢鎖
class Singleton private contructor() {
companion object {
val instance: Singleton by lazy(mode=LayzThreadSafetyMode.SYNCHRONIZED) {
Singleton()
}
}
}
- 靜態(tài)內(nèi)部類
class Singleton private contructor() {
companion object {
private object Holder { val holder = Singleton()}
fun getInstance() = Holder.holder
}
}
一般情況下,不建議使用懶漢式痴荐,建議使用餓漢式血柳;當(dāng)明確需要延時加載時,用靜態(tài)內(nèi)部類方式生兆;如由特殊需求時难捌,可以考慮使用雙檢鎖方式。