目錄
- 簡介
- 懶漢式
- 餓漢式
- 靜態內部類
- 列舉
序言:在寫單例模式之前,我知道網上有一堆博客已經寫過單例模式了,之所以再寫,只是單純想做一個記錄,個人認為單例模式是最為基礎且最簡單的設計模式之一,不然面試怎么逢人就問,但是單例模式,據我所了解能用的應該有4種常規寫法(非執行緒安全的可以理解為沒辦法在真實生產環境運用),
簡介
單例模式是創建型設計模式的一種,意圖保證一個類只有一個實體,并提供一個訪問它的全域訪問點
優點:
- 在記憶體里只有一個實體,減少了記憶體的開銷,尤其是頻繁創建和銷毀物件實體
- 避免對資源的多重占用(比如寫檔案操作)
場景:
- 創建的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連接等
- 多執行緒的執行緒池的設計一般也是采用單例模式,這是由于執行緒池要方便對池中的執行緒進行控制
- 作業系統的檔案系統

懶漢式
- 是否懶加載: 是
- 是否執行緒安全: 是
//最為推薦的懶漢式寫法
class Singleton {
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;
}
}
餓漢式
- 是否懶加載: 否
- 是否執行緒安全: 是
// 餓漢式(靜態變數)
class Singleton {
//本類內部創建物件實體
private static final Singleton _INSTANCE = new Singleton();
// 構造器私有化
private Singleton() {}
//提供一個公有的靜態方法
public static Singleton getInstance(){
return _INSTANCE;
}
}
靜態內部類
- 是否懶加載: 是
- 是否執行緒安全: 是
//內部類實作單例模式,執行緒安全,懶加載
class Singleton{
//構造器私有化
private Singleton(){}
//寫一個靜態內部類,該類中有一個靜態屬性 Singleton
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
//提供一個靜態的公有辦法,直接回傳Singleton.instance
public static synchronized Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}
列舉
- 是否懶加載: 否
- 是否執行緒安全: 是
//列舉 天然單例
enum Singleton{
INSTANCE;
}
總結: 個人認為列舉最為簡單,畢竟天然單例,其他寫法看自己所需要的場景吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/4549.html
標籤:設計模式
上一篇:工廠模式
下一篇:【設計模式】前言
