單例模式 之 單例模式 Holder

2022-01-23 13:27:04 字數 2107 閱讀 5161

之前我寫過 單例模式中的餓漢模式和懶漢模式

他們雖然都能實現單例模式 但是優缺點很明顯

餓漢模式:不能懶載入(類載入就會被例項化),消耗很大,在併發情況下安全性很高。

懶漢模式:能實現懶載入,但是在併發情況下安全性不是很高。雖然一步一步的優化,安全性得到了保證,但是卻使用了synchronized 對效能有所影響。

今天記錄一下 holder 模式

它結合了餓漢模式 安全性,也結合了懶漢模式懶載入。不會使用synchronized 所以效能也有所保證。

**:holder 模式與其說是 餓漢模式和懶漢模式相結合,不如說是思維的更高一層的表現。23種設計模式是(短期)不會變的,但是思想會變。

holder 模式就是將我們要構造的例項交於其內部類進行例項。

private :表明不能被他人呼叫,

static: 靜態的內部類 不會率先被載入,只有主類被呼叫的時候被載入(解決了懶載入問題),並且 

private static holdersingleton instance=newholdersingleton(); 只會載入一次。
/**

* holder模式 */

public

class

holdersingleton

/*** 私有的 靜態 內部類

類級的內部類,也就是靜態的成員式內部類,該內部類的例項與外部類的例項 沒有繫結關係,而且只有被呼叫到時才會裝載,從而實現了延遲載入。 

*/private

static

class

holderdemo

public

static

holdersingleton getinstance()

/*** 測試

* @param

args

*/public

static

void

main(string args) ).start();}}

}

測試結果:

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

com.company.holdersingleton@616831d4

process finished with exit code 0

其實很想聊聊 static 機制的, 發現自己也是懵懵懂懂,待到以後仔細研究一下在另外寫一篇關於 static的文章吧。

之所以說 靜態的內部類會在主類呼叫的時候才會被載入,也是我看別人這沒說(很多人也是這沒說)。以後真正了解了static 才敢保證正確與否,不過此種方式確實重新整理了我的認識

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例模式之列舉單例

列舉也是餓漢式。列舉單例 問題1 列舉單例是如何限制例項個數的 反編譯後可以看到 就是我們列舉類的乙個靜態成員變數而已,單例項的 問題2 列舉單例在建立時是否有併發問題 沒有,因為它也是靜態成員變數,它的執行緒安全性也是在類載入階段完成的。那個時候不會有執行緒併發問題 問題3 列舉單例能否被反射破壞...