前情回顧:
不知大家是否曾有過類似經歷。在做機房收費的時候,單擊選單欄的某個按鈕,click 一次便出現一次此窗體,從而導致乙個主介面裡出現過多相同的窗體,但理想狀態是不管如何單擊,乙個主介面我們只想要某窗體只出現一次。此時,單例模式便可派上大用場。
計畫生育,還是乙個好:
懶漢單例模式:
單例模式是相對於眾多模式中最嚴謹守法的好模式。它能保證乙個類只有唯一乙個物件被例項化,並只提供乙個全域性訪問點。
具體方法是在需要單例的類中寫入私有的構造方法,導致外界不能使用new建立例項。再定義乙個訪問本類例項的唯一乙個全域性訪問點,從中判斷此類有否被例項化過,如果沒有,例項化此類。如果已經例項化,則顯示已例項化物件。
具體**如下:
class singleton
public static singleton getinstance()//寫出乙個全域性公有的getinstance方法,來對instance進行判斷,最後訪問。
return instance; }
}
結構圖如下:
多執行緒時的單例:
1、鎖定
在作業系統概論一書中,詳細講述了執行緒等概念,在此不再贅述。
多執行緒時,同時訪問此類呼叫getinstance方法,也有可能導致建立出多個例項。可以利用lock鎖,讓個執行緒有條不紊的one by one依次進入。
class singleton
public static singleton getinstance()//
}return instance;}}
2、雙重鎖定但是這樣我們就讓執行緒每次都給加鎖,不斷的重複。所以可以優化一下,先進行判斷,只對沒有例項化的時候再加鎖處理,防止多個getinstance被呼叫。這就是傳說中的雙重鎖定。
double-check lock:
class singleton
public static singleton getinstance()//
}} return instance;
} }
懶漢靜態初始化:其實嚴於律己遵守國家規章制度的不只單例一人,還有一位「靜態初始化」君。通過乙個秘密的sealed關鍵字達到同樣防止多生的效果。
具體實現如下:
public sealed class singleton
public static singleton getinstance()\
}
餓漢 vs 懶漢至於餓漢懶漢的稱謂主要**於單例模式要在此一次被引用時,才將自己例項化,相對於靜態初始化在自己一被載入的時候就積極例項化而言,表現得懶惰不積極,所以單例模式是個大懶蛋。而靜態初始化方法又顯得稍微有點太積極主動了,太希望實現自我價值了,早早的就給自己佔了個空間。所以被稱為餓漢式單例類。不過懶漢餓漢,只要遵紀守法,就是好漢。 懶漢餓漢單例模式
懶漢式單例類,在第一次呼叫時的時候例項化自己 public class singleton private static singleton single null 靜態工廠方法 public static singleton getinstance return single 執行緒安全的懶漢式單...
單例模式 懶漢,餓漢
1.懶漢模式 顧名思義,他是乙個懶漢,他不願意動彈。什麼時候需要吃飯了,他就什麼時候開始想辦法搞點食物。即懶漢式一開始不會例項化,什麼時候用就什麼時候new,才進行例項化。2.餓漢模式 顧名思義,他是乙個餓漢,他很勤快就怕自己餓著。他總是先把食物準備好,什麼時候需要吃了,他隨時拿來吃,不需要臨時去搞...
單例模式 懶漢,餓漢
單例模式 定義 乙個類有且只有乙個例項,並且可以自行例項化向整個系統提供 實現 1.只提供私有的構造方法 2.在該類中建立該型別的私有靜態物件 3.提供乙個靜態的公有方法用於建立,獲取私有物件 餓漢式 建立物件例項的時候直接初始化 假設類名為single1 實現 public class singl...