正文
一、定義
單件模式確保一個類只有一個例項,並提供一個全域性訪問點。
要點:
- 定義持有唯一單件例項的類變數。
- 私有化構造,避免其他類產生例項。
- 對外提供獲取單件例項的靜態方法。
二、實現步驟
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);
}
}