1. 程式人生 > >設計模式01 建立型模式 - 單例模式(Singleton Pattern)

設計模式01 建立型模式 - 單例模式(Singleton Pattern)

參考

[1] 設計模式之:建立型設計模式(6種) | 部落格園

[2] 單例模式的八種寫法比較 | 部落格園

 

單例模式(Singleton  Pattern)

確保一個類有且僅有一個例項,並且為客戶提供一個全域性訪問點。

 

特點

1) 保證被訪問資源物件在記憶體中只有一個例項,節約了系統記憶體資源,也避免了對資源多重佔用;

2) 封裝了訪問例項方法,提供全域性訪問點,嚴格控制客戶的訪問方式;

3) 通常常駐記憶體,不會頻繁建立/銷燬,節約了系統開銷;

 

缺點

1) 沒有抽象層,難以擴充套件;

2) 類的職責過重,往往一個單例負責所有與之相關功能,違背了類設計的“職責單一”原則;

3) 單例如果持有context,容易造成記憶體洩漏;

4) 全域性共享一個例項資源,難以隔離問題,進行單獨測試;

 

適用場景

1)全域性隨時可能需要訪問,訪問方式複雜,而且資源受限;

2)需要常駐記憶體,避免頻繁建立、銷燬的資源;

 

demo

單例模式通用UML類圖

 

 

 

單例模式的8種寫法與多執行緒

單例模式為了不讓外部隨意構建例項,一般需要將建構函式宣告為private,在獲取例項物件時,就無法通過動態函式來讀取(因為此時例項還未初始化),故只能通過類方法(static方法)來獲取例項引用。

 

 1. 餓漢式 靜態常量

//餓漢式 靜態常量
public class Singleton {
	private final static Singleton INSTANCE = new Singleton();
	
	private Singleton()	{	}
	public static Singleton getInstance() { return INSTANCE; }
	
	public void displaySingleton(){
		System.out.println("This is a Singleton.");
	}

}

 

特點:簡單,類裝載時完成初始化,不存在多執行緒同步問題;

優點:沒有延遲例項化,如果程式一直沒有使用,會造成資源浪費;

 

2.餓漢式 靜態程式碼塊

與餓漢式 靜態常量類似,只是把例項初始化放在了類的靜態程式碼塊中,而非放在例項引用定義處。

// 餓漢式 靜態程式碼塊
public class Singleton1 {
	private static Singleton1 instance;
	
	static{
		instance = new Singleton1();
	}
	
	private Singleton1(){}
	
	public static Singleton1 getInstance(){
		return instance;
	}
	
	public void displaySingleton(){
		System.out.println("單例初始化方式: 餓漢式 靜態程式碼塊");
	}
}

  

 

總結