單例模式
概念:
顧名思義,就是隻有一個實例。
作爲對象的創建模式[GOF95], 單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱爲單例類。
要點:
一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
在下面的對象圖中,有一個"單例對象",而"客戶甲"、"客戶乙" 和"客戶丙"是單例對象的三個客戶對象。
可以看到,所有的客戶對象共享一個單例對象。而且從單例對象到自身的連接線可以看出,單例對象持有對自己的引用。
案例:
先看兩段代碼(注意描述部分與註釋);
1,餓漢式單例類
/**
* @author wonter
* 描述:餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以後不在改變
* 郵件: [email protected]
*/
public class Singleton {
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
private Singleton(){
//空構造 防止被其他類new
}
//外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
2,懶漢式單例類
/**
* @author wonter
* 比較: 這個方法比上面有所改進,不用每次都進行生成對象,只是第一次。使用時生成實例,提高了效率!
* 描述:懶漢式如果在創建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的
* 郵件: [email protected]
*/
public class Singleton {
private static Singleton instance = null;
//抽象集團類,線程互斥,排隊模式
public static synchronized Singleton getInstance() {
if (instance==null)// 線程1
instance=new Singleton();
//線程1後,才允許線程2運行
return instance;
}
}
好處:
單例模式屬於構建模式之一,實例控制--伸縮性
缺點:
系統開銷---開發混淆---對象生命週期
代理模式:
工廠模式