單例模式的意思就是隻有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱爲單例類。
單例可以保護某些不建議在系統中重複創建的資源,或者由於某些資源創建時會花費大量機時,但使用頻率較低的資源。如打印機資源。如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。
如有不正確的地方,請給予指正。謝謝。