javaSE基礎-單例設計模式

單例模式:一個類在內存中只有一個對象
思想:1、保證對象唯一,避免建立多個對象,禁止其他程序創建該類對象
2、爲了可以讓其他程序訪問到該類,在本類自定義一個對象
3、給其他程序提供訪問方式
實現:1、將構造函數私有化
2、在類中創建一個本類對象
3、提供一個方法可以獲取該對象
特有參數這個單例模式纔有意義

//實際開發推薦 餓漢式
/**
* 餓漢式,single類一進內存就已創建好對象
* 記憶點:管他餓不餓,先創建再說
*/
class Single{
	//特有參數
	private string para;
	get/set();
	//私有化構造方法
	private Single(){}
	//私有的創建對象方法
	private static Single single = new Single();
	//給外部提供調用方法
	public static Single getInstance(){
		return single;
	}
}
/**
* 懶漢式,single類進內存還沒有創建對象,只有調用了getInstance()方法才創建對象
* 記憶點:創建對象時先問一下 餓不? true 創建 false 直接返回
*/
class Single{
	//特有參數
	private string para;
	get/set();
	//私有化構造方法
	private Single(){}
	//私有的創建對象方法
	private static Single single = null;
	//給外部提供調用方法
	/**
	* TODO此處存在問題:如果兩個調用同時(a進程掛起時,b進程進來)進來就會造成對象不唯一
	*/
	/*解決方案1:方法加synchronized關鍵字 
				缺點:效率比較低,進來就判斷*/
	p1:public static synchronized Single getInstance(){
			if(null != single)
				single = new Single();
			return single;
		}
	/*解決方案2:先判斷是否存在對象,不存在 則先給single類加鎖,再創建對象,如果存在兩個進程同時進來,則二次判斷就保證唯一 
				缺點:代碼量增加*/
	p2:public static Single getInstance(){
			if(null != single){
				synchronized(Single.class){
					if(null != single)
						single = new Single();
				}	
			}
		}
}

class SingleDemo{
	public static void main(String[] args){
		Single single = Single.getInstance();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章