單例形式(Singleton Pattern)是軟件計劃形式中的一種創建型形式,它確保一個類只有一個實例,並供給一個全局拜訪點。這種形式廣泛利用於各種編程言語跟開辟場景,旨在避免因東西創建過多而招致的資本揮霍跟潛伏錯誤。在本篇文章中,我們將深刻探究單例形式的不雅點、實現方法、優毛病以及實用處景。
單例形式的基本道理
1. 單例形式的定義
單例形式請求一個類僅有一個實例,並供給一個拜訪它的全局拜訪點。這意味着無論你實驗創建多少次該類的實例,都只能前去同一個實例東西。
2. 單例形式的核心特點
- 全局拜訪點:全部東西經由過程一個統一的拜訪點來獲取單例實例。
- 唯一實例:確保只有一個實例存在。
- 勤加載:實例的創建耽誤到第一次利用時。
單例形式的實現方法
1. 餓漢式(Eager Initialization)
在類加載時就創建實例,保證了線程保險但就義了耽誤初始化的上風。
public class SingletonEager {
private static final SingletonEager INSTANCE = new SingletonEager();
private SingletonEager() {}
public static SingletonEager getInstance() {
return INSTANCE;
}
}
2. 勤漢式(Lazy Initialization)
在第一次挪用 getInstance()
方法時才創建實例,實用於單線程情況。
public class SingletonLazy {
private static SingletonLazy instance;
private SingletonLazy() {}
public static synchronized SingletonLazy getInstance() {
if (instance == null) {
instance = new SingletonLazy();
}
return instance;
}
}
3. 雙重檢查鎖定(Double-Checked Locking)
結合了餓漢式跟勤漢式的長處,實用於多線程情況。
public class SingletonDCL {
private static volatile SingletonDCL instance;
private SingletonDCL() {}
public static SingletonDCL getInstance() {
if (instance == null) {
synchronized (SingletonDCL.class) {
if (instance == null) {
instance = new SingletonDCL();
}
}
}
return instance;
}
}
4. 靜態外部類(Static Inner Class)
利用靜態外部類來實現單例形式,實用於多線程情況。
public class SingletonStaticInner {
private static class SingletonHolder {
private static final SingletonStaticInner INSTANCE = new SingletonStaticInner();
}
private SingletonStaticInner() {}
public static final SingletonStaticInner getInstance() {
return SingletonHolder.INSTANCE;
}
}
5. 羅列實現(Enum)
利用羅列實現單例形式是一種簡潔、保險且高效的方法。
public enum SingletonEnum {
INSTANCE;
public void someMethod() {
// ...
}
}
單例形式的優毛病
長處
- 節儉資本:避免創建過多實例,節儉體系資本。
- 全局拜訪:供給統一的拜訪點,便利管理跟把持。
- 易於擴大年夜:單例類可能經由過程子類化來擴大年夜。
毛病
- 破壞封裝性:單例形式可能會破壞類的封裝性,招致其他類無法創建實例。
- 不易測試:單例形式可能使得單位測試變得艱苦。
單例形式的實用處景
- 全局設置:如數據庫連接池、線程池等。
- 東西類:如日記記錄器、設置管理器等。
- 插件框架:如MVC框架中的把持器(Controller)。
經由過程本文的介紹,信賴你對單例形式有了更深刻的懂得。控制單例形式,可能使你的代碼更簡潔、高效,同時進步體系的牢固性跟可保護性。在現實開辟中,根據具體場景抉擇合適的單例形式實現方法至關重要。