定義
確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。
使用場景
確保某各類有且只有一個對象的場景,避免產(chǎn)生多個對象消耗過多的資源,或者某種類型的對象只應該有且只有一個。例如,創(chuàng)建一個對象需要消耗的資源過多,例如需要訪問數(shù)據(jù)庫或者IO等資源。
實現(xiàn)關鍵點
- 構造函數(shù)不對外開放,一般為private;
- 通過一個靜態(tài)方法或者枚舉返回實例類對象;
- 確保單例類的對象有且只有一個,尤其是在多線程環(huán)境下;
- 確保單例類對象在反序列化時不會重新構建對象。
推薦的實現(xiàn)方式
-
Double Check Lock(DCL)實現(xiàn)單例
public class SingleTon {
private volatile static SingleTon sInstance = null;
private SingleTon() {}
public static SingleTon getInstance() {
if (sInstance == null) {
synchronized (SingleTon.class) {
if (sInstance == null) {
sInstance = new SingleTon();
}
}
}
return sInstance;
}
}
-
靜態(tài)內(nèi)部類單例模式
public class SingleTon {
private SingleTon() {}
public static SingleTon getInstance() {
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static final SingleTon sInstance = new SingleTon();
}
}
其他的實現(xiàn)方式
-
餓漢模式
public class SingleTon {
private static final SingleTon sInstance = new SingleTon();
private SingleTon() {}
public static SingleTon getInstance() {
return sInstance;
}
}
-
懶漢模式
public class SingleTon {
private static final SingleTon sInstance;
private SingleTon() {}
public synchronized static SingleTon getInstance() {
if (sInstance == null) {
sInstance = new SingleTon();
}
return sInstance;
}
}
-
枚舉單例
public enum SingletonEnum {
INSTANCE;
}
-
容器實現(xiàn)
public class SingletonManager {
private static Map<String, Object> sObjMap = new HashMap<>();
private SingletonManager() {}
public static void registerService(String key, Object instance) {
if (!sObjMap.containsKey(key)) {
sObjMap.put(key, instance);
}
}
public static Object getService(String key) {
return sObjMap.get(key);
}
}