快速了解設計模式之單例模式 附贈史上最牛單例

2021-10-02 19:12:48 字數 2030 閱讀 1795

生活中很多東西都是獨一無二的, 比如每個人都是唯一的, 不可能有第二個自己; 電腦中的任務管理器只能開啟乙個, 那就是單例, 而qq能開啟多個, 那就是多例. 反映在程式設計裡, 單例就是乙個類只允許產生乙個物件, 不允許建立多個物件!

說起單例模式, 不得不提到: 「餓漢式單例」 和 「懶漢式單例」, 所謂"餓漢"就是程式一執行就迫不及待地產生唯一的物件, 而"懶漢"正好相反, 程式執行起來時不急著建立物件, 直到外界來問它要物件的時候, 才開始建立. 兩者各有各的好處, 下面我們乙個個分析

/**

* @author cqf

*/public

class

singleton

//產生乙個物件

private

static singleton singleton =

newsingleton()

;//對外暴露乙個獲取例項的靜態方法

public

static singleton getinstance()

}class

singletontest

}

執行結果:確實是同乙個物件

//宣告乙個物件,但不初始化

private

static singleton singleton = null;

//對外暴露乙個獲取例項的靜態方法

public

static singleton getinstance()

else}}

class

singletontest

}執行結果:

餓漢式單例在一開始就建立物件, 在程式剛開始執行時可能慢一點, 但是後來再拿物件速度就很快了, spring容器用的也是這種策略; 因為一開始就建立了, 不確定是否用得到這個物件, 如果用不到的話, 會產生資源浪費, 另外它天生是執行緒安全的, 因為一開始就建立物件的話, 執行緒不會誤操作. 那麼懶漢式的優缺點真好反過來

有沒有辦法把兩者的優點集中起來, 並拋棄掉缺點(取其精華, 去其糟粕)? 當然有!那就是懶漢式靜態內部類單例

話不多說, 上**:

/**

* @author cqf

*/public

class

singleton

}//靜態內部類

private

static

final

class

innersingletonclass

//對外暴露乙個獲取例項的靜態方法

public

static singleton getinstance()

}class

singletontest

}

利用靜態內部類巧妙地節省了資源又保證了執行緒安全; 原因是靜態內部類預設不載入, 所以節省了資源, 至於執行緒安全問題, 那是由虛擬機器保證的:

虛擬機會保證乙個類的clinit()方法在多執行緒環境中被正確的加鎖、同步,如果多個執行緒同時去初始化乙個類,那麼只會有乙個執行緒去執行這個類的clinit()方法,其他執行緒都需要阻塞等待,直到活動執行緒執行clinit()方法完畢。需要注意的是,其他執行緒雖然會被阻塞,但如果執行clinit()方法的那條執行緒退出clinit()方法後,其他執行緒喚醒後不會再次進入clinit()方法. --《深入理解jvm》

了解單例設計模式

餓漢式單例 singleton類裡面會始終維持乙個instance 的例項化物件,然而並不關心這個物件是否被使用。package com.gen 單例設計類 class singleton public static singleton getinstance 測試類 客戶端 public clas...

了解23種設計模式之單例模式

一,什麼是單例模式?單例模式是一種物件建立型模式,使用單例模式,可以保證為乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件。其實,gof gang of four,代表意思是 設計模式一書,四個作者,被稱為四人組 對單例模式的定義是 保證乙個類,只有乙個例項存在,同事提...

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...