單例模式(Singleton Pattern)是一種設計模式,用于確保一個類只有一個實例,并提供一個全局訪問點來獲取該實例。在軟件設計中,單例模式常用于控制對資源的訪問,例如數據庫連接、線程池等。以下是單例模式的詳細介紹及JAVA代碼實現。
一、單例模式的優點
- 控制資源的使用,避免資源的多重占用。
- 提供全局訪問點,方便資源的管理。
- 系統中只有一個實例,減少內存開銷。
- 避免對資源的多重占用,提高系統的性能。
二、單例模式的缺點
- 單例模式可能會引起代碼的不透明性。
- 單例模式可能會導致代碼的測試困難。
- 單例模式可能會導致并發問題。
三、單例模式的實現方式 單例模式有多種實現方式,以下列舉幾種常見的實現方式:
- 懶漢式(線程不安全)
- 懶漢式(線程安全)
- 餓漢式
- 雙重校驗鎖
- 靜態內部類
- 枚舉 以下分別對這幾種實現方式進行詳細說明及代碼實現。
- 懶漢式(線程不安全) 懶漢式單例模式在類加載時不初始化,在需要時才創建實例。缺點是線程不安全。
-
JAVA代碼實現:
public?class?Singleton?{//?私有靜態變量,用于存儲單例實例private?static?Singleton?instance;//?私有構造方法,防止外部直接創建實例private?Singleton()?{}//?公有靜態方法,用于獲取單例實例public?static?Singleton?getInstance()?{if?(instance?==?null)?{instance?=?new?Singleton();}return?instance;}
}
-
懶漢式(線程安全) 在懶漢式的基礎上,通過同步方法保證線程安全。缺點是效率較低。 JAVA代碼實現:
public?class?Singleton?{private?static?Singleton?instance;private?Singleton()?{}//?同步方法,保證線程安全public?static?synchronized?Singleton?getInstance()?{if?(instance?==?null)?{instance?=?new?Singleton();}return?instance;}
}
-
餓漢式 餓漢式單例模式在類加載時就完成了初始化,保證了線程安全。缺點是類加載時就初始化,可能會浪費資源。 JAVA代碼實現:
public?class?Singleton?{//?私有靜態變量,類加載時初始化private?static?Singleton?instance?=?new?Singleton();private?Singleton()?{}public?static?Singleton?getInstance()?{return?instance;}
}
-
雙重校驗鎖 雙重校驗鎖單例模式在懶漢式的基礎上,通過雙重校驗鎖保證線程安全,同時提高效率。 JAVA代碼實現:
public?class?Singleton?{//?私有靜態變量,使用volatile關鍵字保證多線程下的可見性和禁止指令重排序private?static?volatile?Singleton?instance;private?Singleton()?{}public?static?Singleton?getInstance()?{if?(instance?==?null)?{synchronized?(Singleton.class)?{if?(instance?==?null)?{instance?=?new?Singleton();}}}return?instance;}
}
-
靜態內部類 靜態內部類單例模式利用靜態內部類的特性,實現懶加載和線程安全。 JAVA代碼實現:
public?class?Singleton?{//?私有構造方法private?Singleton()?{}//?靜態內部類,用于持有單例實例private?static?class?SingletonHolder?{private?static?final?Singleton?INSTANCE?=?new?Singleton();}//?公有靜態方法,獲取單例實例public?static?final?Singleton?getInstance()?{return?SingletonHolder.INSTANCE;}
}
-
枚舉 枚舉單例模式利用枚舉的特性,實現單例,且自動支持序列化機制,防止反射攻擊。 JAVA代碼實現:
public?enum?Singleton?{//?枚舉元素,本身就是單例INSTANCE;//?公有方法,可以添加其他業務方法public?void?doSomething()?{//?業務邏輯}
}
四、總結
單例模式是一種簡單且常用的設計模式,適用于需要確保一個類只有一個實例的場景。在實際開發中,應根據具體需求選擇合適的實現方式。