設計模式-單例模式

單例模式的意思就是隻有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱爲單例類。

單例可以保護某些不建議在系統中重複創建的資源,或者由於某些資源創建時會花費大量機時,但使用頻率較低的資源。如打印機資源。如servlet或者hibernate裏面的sessionfactory。


創建單例的方法:

方法一:

//餓漢式
class Singleton {
     
    //私有,靜態的類自身實例
    private static Singleton instance = new Singleton();
     
    //私有的構造子(構造器,構造函數,構造方法)
    private Singleton(){}
     
    //公開,靜態的工廠方法
    public static Singleton getInstance() {
        return instance;
    }
}

1,餓漢式是典型的空間換時間,當類裝載的時候就會創建類實例,不管你用不用,先創建出來,然後每次調用的時候,就不需要再判斷了,節省了運行時間。



方法二:

//懶漢式
class Singleton { 
  	private static Singleton instance=null;
  	private Singleton(){}
  	public static Singleton getInstance() {
     		if(instance==null){
      			instance=new Singleton();
      			return instance; 
		}
	}
} 

1,懶漢式是典型的時間換空間,也就是每次獲取實例都會進行判斷,看是否需要創建實例,浪費判斷的時間。當然,如果一直沒有人使用的話,那就不會創建實例,則節約內存空間。但是可能產生線程安全的問題。

2,當然懶漢式也是可以實現線程安全的,只要加上synchronized即可。還可以雙重檢查加鎖。



方法三:

//靜態代碼塊實現 些方法可以只單例某一個屬性。
public class Singleton {
	private static  Singleton  instance = null;
	
	private Singleton() {

	}
	static{
		instance = new Singleton();
	}
	public static Singleton getInstance(){
		return instance;
	}
}


由此還可以聯繫到hibernate所提供的get和load方法。其中對於get和load的根本區別,一句話,hibernate對於load方法認爲該數據在數據庫中一定存在,可以放心的使用代理來延遲加載(類似於懶漢模式),如果在使用過程中發現了問題,就拋異常;而對於get方法,hibernate一定要獲取到真實的數據(類似於餓漢模式),否則返回null。



如有不正確的地方,請給予指正。謝謝。

發佈了33 篇原創文章 · 獲贊 8 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章