因為在設計或開發中,肯定會有這麼一種情況,乙個類只能有乙個物件被建立,如果有多個物件的話,可能會導 致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使 用的情形也不相同。今天要實現的是常用的三種,分別是餓漢式、懶漢式和多執行緒式。
單例模式的要點有三個:
單例類只能有乙個例項
它必須自行建立這個例項
它必須自行向整個系統提供提供這個例項。
從具體實現角度來說,就是以下三點:
單例模式的類只提供私有的建構函式
類定義中含有乙個該類的靜態私有物件
該類提供了乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件
單例模式的一些注意點:
1.例項控制:單例模式會阻止其他物件例項化自己的單例物件的副本,從而確保所有物件都訪問唯一 例項
2.靈活性:因為類控制例項化過程,所以類可以靈活更改例項化過程
3.開銷:雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷, 這個問題可以通過靜態初始化解決此問題定義乙個私有的靜態指標,和乙個公有的靜態函式
單例模式的優點:
1. 在記憶體中只有乙個物件,節省記憶體空間
2. 避免頻繁的建立銷毀物件,可以提高效能
3. 避免對共享資源的多重占用
4. 可以全域性訪問
單例模式的適用場景:
1. 需要頻繁例項化然後銷毀的物件
2. 建立物件耗時過多或者耗資源過多,但又經常用到的物件
3. 有狀態的工具類物件
4. 頻繁訪問資料庫或檔案的物件
5. 以及其他要求只有乙個物件的場景
接下來寫乙個懶漢式單例,**如下:
標頭檔案**:
class bookmanager
//讓建構函式為 private,這樣該類就不會被例項化
}懶漢式的特點:
lazy 初始化
非多執行緒安全
優點:第一次呼叫才初始化,避免記憶體浪費。
缺點:必須加鎖(在「執行緒安全」部分分享如何加鎖)才能保證單例,但加鎖會影響效率。
原始檔**:
bookmanager *bookmanager::p = null; //私有靜態指標(靜態成員變數必須在類外面初始化)
bookmanager * bookmanager::bookmanager() //靜態方法,供外界獲取它的靜態例項。(公有靜態函式)
return p;
}
單例模式 懶漢模式
在實際應用中,我們往往希望在使用的時候才進行類的載入,而不希望類初始化的時候就進行載入,所以單例模式又有了另外一種實現,懶漢模式 一.延遲載入 如下 public class myobject public static myobject getinstance return myobject 延遲...
懶漢單例模式
單例設計模式 懶漢單例模式 能夠保證在只有用它的時候才建立它的物件。目前還不能保證乙個類在記憶體中只有乙個物件。懶漢單例模式設計步驟 1 私有化建構函式 2 生命本類的引用型別變數,但是不要建立物件 3 提供公共的靜態方法獲取本類的物件,獲取之前先判斷是否已經建立了本類的物件,如果已經建立了,那麼直...
單例模式 懶漢
1 執行緒不安全 執行緒不安全 public class private private 雙重檢測 鎖 return public 2 執行緒安全 雙重檢測 鎖 volatile 執行緒安全 public class private static private 雙重檢測 鎖 volatile re...