《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);