《Head First 設計模式》:單件模式
阿新 • • 發佈:2020-08-02
正文
一、定義
單件模式確保一個類只有一個例項,並提供一個全域性訪問點。
要點:
- 定義持有唯一單件例項的類變數。
- 私有化構造,避免其他類產生例項。
- 對外提供獲取單件例項的靜態方法。
二、實現步驟
1、建立單件類
(1)方式一:懶漢式
延遲建立單件例項。
執行緒不安全:
/** * 單件類(懶漢式、執行緒不安全) */ public class Singleton { /** * 唯一單件例項 */ private static Singleton uniqueInstance; /** * 私有構造 */ private Singleton() {} /** * 獲取單件例項 */ public static Singleton getInstance() { if (uniqueInstance == null) { // 延遲建立單件例項 uniqueInstance = new Singleton(); } return uniqueInstance; } }
執行緒安全:
/** * 單件類(懶漢式、執行緒安全) */ public class Singleton { /** * 唯一單件例項 */ private static Singleton uniqueInstance; /** * 私有構造 */ private Singleton() {} /** * 獲取單件例項(同步方法) */ public static synchronized Singleton getInstance() { if (uniqueInstance == null) { // 延遲建立單件例項 uniqueInstance = new Singleton(); } return uniqueInstance; } }
(2)方式二:餓漢式
“急切”建立單件例項。
/** * 單件類(餓漢式) */ public class Singleton { /** * 唯一單件例項(“急切”建立單件例項) */ private static Singleton uniqueInstance = new Singleton(); /** * 私有構造 */ private Singleton() {} /** * 獲取單件例項 */ public static Singleton getInstance() { return uniqueInstance; } }
(3)方式三:雙檢鎖
/**
* 單件類(雙重檢查加鎖)
*/
public class Singleton {
/**
* 唯一單件例項
*/
private volatile static Singleton uniqueInstance;
/**
* 私有構造
*/
private Singleton() {}
/**
* 獲取單件例項
*/
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
2、使用單件類獲取唯一單件例項
public class Test {
public static void main(String[] args) {
// 獲取單件例項
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton2);
}
}