Java設計模式菜鳥系列(六)單例模式建模與實現

轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/39784403


單例模式(Singleton):是一種常用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。好處主要有:1、某些類創建比較頻繁,對於一些大型的對象,這是一筆很大的系統開銷。2、省去了new操作符,降低了系統內存的使用頻率,減輕GC壓力。

單例模式主要有兩種實現方式:1、懶漢式;2、餓漢式


一、uml建模


二、代碼實現:

 1、懶漢式

/**
 * 示例:單例--單例對象能保證在一個JVM中,該對象只有一個實例存在。
 * 
 * 缺點:這種做法在多線程環境下,不安全
 * 
 * 懶漢式
 */

class Singleton {
	/**
	 * 持有私有靜態變量(也稱類變量),防止被引用
	 * 
	 * 此處賦值爲null,目的是實現延遲加載 (因爲有些類比較龐大,所以延遲加載有助於提升性能)
	 */
	private static Singleton instance = null;

	/** 私有構造方法,防止被實例化 */
	private Singleton() {

	}

	/** 靜態工廠方法,創建實例 --只不過這裏是創建自己,而且只能創建一個 */
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}

	public void info() {
		System.out.println("this is a test method...");
	}
}

/**
 * 客戶端測試類
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		/**
		 * 調用普通方法
		 */
		s1.info();
		Singleton s2 = Singleton.getInstance();
		/**
		 * 運行結果爲true,說明s1、s2這兩個類變量都指向內存中的同一個對象
		 */
		System.out.println(s1 == s2);
	}
}


2、餓漢式

/**
 * 餓漢式
 */

class Singleton {
	private static Singleton instance = new Singleton();

	private Singleton() {

	}

	public static Singleton getInstance() {
		return instance;
	}

	public void info() {
		System.out.println("this is a test method...");
	}
}

/**
 * 客戶端測試類
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		/**
		 * 調用普通方法
		 */
		s1.info();
		Singleton s2 = Singleton.getInstance();
		/**
		 * 運行結果爲true,說明s1、s2這兩個類變量都指向內存中的同一個對象
		 */
		System.out.println(s1 == s2);
	}

}

3、如果考慮多線程,那麼getInstance()方法要加同步synchronized,這時餓漢式比懶漢式要好,儘管資源利用率要差,但是不用同步。

/**
 * 
 * 考慮多線程的時候,下面這種做法可以參考一下:--懶漢式
 * 
 * 在創建類的時候進行同步,所以只要將創建和getInstance()分開,單獨爲創建加synchronized關鍵字
 * 
 * 這種做法考慮性能的話,整個程序只需創建一次實例,所以性能也不會有什麼影響。
 * 
 * @author Leo
 */
public class SingletonTest {

	private static SingletonTest instance = null;

	private SingletonTest() {
	}

	private static synchronized void syncInit() {
		if (instance == null) {
			instance = new SingletonTest();
		}
	}

	public static SingletonTest getInstance() {
		if (instance == null) {
			syncInit();
		}
		return instance;
	}
}

三、總結

單例模式保證了一個類只有一個實例,且提供一個訪問全局點的方式,更加靈活的保證了實例的創建和訪問約束。系統中只有一個實例,因此構造方法應該爲私有 餓漢式:類加載時直接創建靜態實例;懶漢式:第一次需要時才創建一個實例,那麼getInstance方法要加同步 餓漢式比懶漢式要好,儘管資源利用率要差,但是不用同步。



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