乙個應用程式中,某個類的例項物件只有乙個,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。你沒有辦法去new,因為構造器是被private修飾的,一般通過getinstance()的方法來獲取他們的例項。getinstance()的返回是乙個物件的引用,並不是乙個新的例項,所以不要錯誤的理解成多個物件。
單例模式有以下特點:
單例類自己建立並且只能建立乙個例項,並且必須給所有其他物件提供這個例項
需要:構造方法私有化
使用private static在該類內部產生乙個唯一的例項物件
定義乙個靜態方法返回這唯一的物件
實現一:立即載入/「餓漢模式」
使用類的時候已經將物件建立完畢(不管以後會不會使用到該例項化物件,先建立了再說。很著急的樣子,故稱為「餓漢模式」),常見的實現方法就是直接new 例項化。
public
class
singleton
// 靜態方法返回該例項
public
static singleton getinstance()
}
「餓漢模式」優缺點
優點:實現起來簡單,沒有多執行緒問題。
缺點:因為它是在類載入的時候就被建立,所以不管該物件是否會被用到都已經建立了。在某些場景下會耗費記憶體。
實現二:延遲載入/「懶漢模式」
延遲載入就是呼叫get()方法時例項才被建立(先不著急例項化出物件,等要用的時候才建立出來,不著急,故又稱為「懶漢模式」),常見的實現方法就是在get方法中進行new例項化。
public
class
singleton
// 靜態方法返回該例項
public
static singleton getinstance()
return instance;
}}
「懶漢模式」的優缺點
優點:實現起來比較簡單,當類singleton被載入的時候,靜態變數static的instance未被建立並分配記憶體空間,當getinstance方法第一次被呼叫時,初始化instance變數,並分配記憶體,因此在某些特定條件下會節約記憶體。
缺點:在多執行緒環境中,這種實現方法是完全錯誤的,根本不能保證單例的狀態。
實現三: 執行緒安全的「懶漢模式」
public
class
singleton
// 靜態方法返回該例項,加synchronized關鍵字實現同步
public
static
synchronized singleton getinstance()
return instance;
}}
優點:在多執行緒情況下,保證了「懶漢模式」的執行緒安全。
缺點:synchronized方法通常效率低,這並不是最佳的實現方案。
實現四:雙重鎖機制
public
class
singleton
// 靜態方法返回該例項
public
static singleton getinstance()
}}return instance;
}}
方法四算是單例模式的最佳實現方式。記憶體佔用率搞,執行緒安全,多執行緒操作原子性。 單例設計模式(餓漢單例設計模式 懶漢單例設計模式)
1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...
設計模式 單例設計模式
歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...