單例模式

序言:在寫單例模式以前,我知道網上有一堆博客已經寫過單例模式了,之因此再寫,只是單純想作一個記錄,我的認爲單例模式是最爲基礎且最簡單的設計模式之一,否則面試怎麼逢人就問,可是單例模式,據我所瞭解能用的應該有4種常規寫法(非線程安全的能夠理解爲沒辦法在真實生產環境運用)。java

簡介

單例模式是建立型設計模式的一種,意圖保證一個類只有一個實例,並提供一個訪問它的全局訪問點面試

優勢:數據庫

  • 在內存裏只有一個實例,減小了內存的開銷,尤爲是頻繁建立和銷燬對象實例
  • 避免對資源的多重佔用(好比寫文件操做)

場景:設計模式

  • 建立的一個對象須要消耗的資源過多,好比 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;
}

 
總結: 我的認爲枚舉最爲簡單,畢竟自然單例,其餘寫法看本身所須要的場景吧安全

相關文章
相關標籤/搜索