java設計模式--單例模式 的簡單例子

問題域:
 --系統中你需要獲得某個類的唯一實例,所有客戶端對它的訪問都將通過一個公共的訪問點獲得
 --創建一個類並使其:(A)定義一個私有的構造器(B)定義一個私有、靜態的變量指向自己(C)定義一個公有、靜態的訪問方法用於返回該類的一個唯一實例

 

分爲 餓漢式懶漢式,下面是一個簡單的示例代碼,應該很容易理解:

package pattern.singleton.basic;

/**
 * java設計模式:單例模式(餓漢式)
 * @author wasw100
 */
public class Singleton {
	// 提供一個靜態私有變量指向自己,屬於類
	private static Singleton instance = new Singleton();// 提前消費
	// 提供私有構造器,只有在當前類中可以使用new,外界不能構造該類的對象
	private Singleton() {
	}

	// 對外提供一個公共訪問點
	public static Singleton getInstance() {
		return instance;
	}
}

 

package pattern.singleton.basic;

/**
 * java設計模式:單例模式(懶漢式)
 * @author wasw100
 */
public class Singleton {
	private static Singleton instance = null;
	private Singleton(){}
	
	//synchronized避免在訪問量比較大的時候 第一個線程的new Singleton還沒來得及賦值給instance,第二個線程就來了,還要進行new ……
	public synchronized static Singleton getInstance(){
		if(instance == null){
			instance = new Singleton();
		}
		return instance;
	}
}

 

package pattern.singleton.basic;

public class ClientClass {

	public static void main(String [] args){
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		System.out.println(s1);
		System.out.println(s2);
	}
}

輸出結果(地址相同,所以指向同一個對象):
pattern.singleton.basic.Singleton@a90653
pattern.singleton.basic.Singleton@a90653

  

說明:

  • 構造方法是私有的,外部類不能實例化,只能在類的內部實例化
  • 餓漢式在類加載時實例化,懶漢式在第一次程序第一次執行getInstance()方法時實例化
  • 懶漢式中synchronized避免在訪問量比較大的時候 第一個線程的new Singleton還沒來得及賦值給instance,第二個線程就來了,還要進行new ……

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章