天天看點

單例模式(餓漢式,懶漢式)

單例

單例模式就是一個對象隻有唯一執行個體,

建立一個類

public class Singleton {
	private Integer id;
	private String name;
}
           
建一個測試類
public class Test {
	public static void main(String[] args) {
		//通過無參的構造方法建立執行個體化對象,系統預設提供一個無參的構造方法
		Singleton s1 = new Singleton();
		Singleton s2 = new Singleton();
		if(s1 == s2){
			System.out.println("同一個執行個體");
		}else{
			System.out.println("不同的執行個體");
		}
	}
	
}
//運作結果是   ---> 不同的執行個體
正常模式下的執行個體化對象,是建立不同的執行個體
           
單例(餓漢式)

将構造方法私有化,這樣外界就無法建立對象的執行個體

//構造方法私有化,外部無法建立對象
	private Singleton(){
		
	}
	//并建立對象的唯一執行個體
	static Singleton instance = new Singleton();
           

這時我們可以通過 —> 類名.對象 直接調用唯一的執行個體

Singleton s3 = Singleton.instance;
		Singleton s4 = Singleton.instance;
		if(s3 == s4){
			System.out.println("同一個執行個體");
		}else{
			System.out.println("不同的執行個體");
		}
		運作結果--->同一個執行個體
           

但是一般情況下我們會将唯一的執行個體給私有化

//建立類的唯一執行個體 靜态的 私有的
	private static Singleton instance = new Singleton();
           

這時外部就無法通過 類名.對象 的方法擷取執行個體

我們可以提供一個擷取執行個體的方法

//建立擷取唯一執行個體的方法
	public static Singleton getInstance(){
		return instance;
	}
           
Singleton s3 = Singleton.getInstance();
		Singleton s4 = Singleton.getInstance();
		if(s3 == s4){
			System.out.println("同一個執行個體");
		}else{
			System.out.println("不同的執行個體");
		}
	}
	//運作結果     同一個執行個體
           

那麼為什麼叫餓漢式呢?

我們建立了類的唯一執行個體,而且是static修飾的,那麼這個執行個體是什麼時候加載的呢?

所有靜态static修飾的東西,都是在類加載的時候生成執行的
           

是以在類加載的時候,類的唯一執行個體就已經被建立,(着急忙慌的吃不飽,是以叫餓漢式)

懶漢式

//構造方法私有化,外部無法建立對象
	private Singleton(){
		
	}
	
	//聲明(而非建立)類的唯一執行個體 靜态的 私有的
	private static Singleton instance ; 
           
//建立唯一執行個體的方法
	public static Singleton getInstance(){
		if(instance == null){
			instance = new Singleton();
		}
		return instance;
	}
           
Singleton s5 = Singleton.getInstance();
		Singleton s6 = Singleton.getInstance();
		if(s5 == s6){
			System.out.println("同一個執行個體");
		}else{
			System.out.println("不同的執行個體");
		}
		//運作結果 ---> 同一個執行個體
           

類加載的時候并沒有建立類的唯一執行個體,隻有當使用者擷取執行個體的時候才會判斷是否建立,顯而易見:第一次擷取執行個體時為空,建立類的唯一執行個體,之後便不需要建立(俗稱懶漢式)

繼續閱讀