【設計模式系列-創造型模式篇】-單例設計模式
阿新 • • 發佈:2018-11-25
單例模式定義
單例模式是一個比較簡單的模式,其定義如下:Ensure a class has only one instance,and provide a global point of access to it.確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。
單例模式應用場景
1、資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如日誌檔案,應用配置等。
2、控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。
單例模式應用詳解
單例模式主要有兩種形式:餓漢式和懶漢式(飽漢式)。
-餓漢式
/** * 餓漢式 */ public classHungrySingleton { // 私有靜態例項物件 private static final HungrySingleton singleton = new HungrySingleton(); // 私有構造方法 private HungrySingleton(){}; // 公共靜態方法 public static HungrySingleton getInstance(){ return singleton; } }
-懶漢式
/** * 懶漢式 */ public class LazySingleton {private static LazySingleton singleton = null; private LazySingleton(){}; public static LazySingleton getInstance(){ if (singleton != null){ singleton = new LazySingleton(); } return singleton; } }
兩種方式對比
餓漢式單例寫起來很簡單,執行緒安全。但是當該類被載入的時候,會初始化該例項和靜態變數並分配記憶體空間,一直佔用記憶體。
飽漢式單例寫起來很簡單,只有第一次呼叫的時候才會初始化,節省了記憶體。但是執行緒不安全,多個執行緒呼叫可能會出現多個例項。
單例模式設計思想
1、靜態例項變數,帶有static關鍵字的屬性在每一個類中都是唯一的。
2、私有化構造方法,限制客戶端隨意創造例項,此為保證單例的最重要的一步。
3、提供一個公共的獲取例項的靜態方法,注意,是靜態的方法,因為這個方法是在我們未獲取到例項的時候就要提供給客戶端呼叫的,所以如果是非靜態的話,那就變成一個矛盾體了,因為非靜態的方法必須要擁有例項才可以呼叫。