一. 單例: 確保一個類只有一個實例,并且提供一個全局訪問點
二. 單例模式的類中, 要有私有的構造器,一個靜態方法和一個靜態變量
三.示例如下:
1. 經典的單例模式
package creationalPattern.singleton.singleton_1;
/**
* 單例模式(延遲創建)
* @author Liyongbin
* @adte 2011-02-06
*
*/
public class Singleton {
//私有類成員(保存類的唯一實例)
private static Singleton uniqueInstance;
//私有構造器(只有Singleton類內才可以調用構造器)
private Singleton(){};
//全局訪問點(用getInstance()方法實例化對象,并返回實例)
public static Singleton getInstance(){
if (null==uniqueInstance) {
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
注意: 此經典的單例實現,不適用于多線程環境;
2. 使用同步方法,解決單例的多線程問題
package creationalPattern.singleton.singleton_2;
/**
* 單例模式(延遲創建)_支持多線程(使用同步方法)
* @author Liyongbin
* @adte 2011-02-06
*
*/
public class Singleton {
//私有類成員
private static Singleton uniqueInstance;
//私有構造器
private Singleton(){};
//全局訪問點
public static synchronized Singleton getInstance(){
if (null==uniqueInstance) {
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
注意: 如果你總是頻繁地創建(getInstance()) 單例的話,以上方法就不適用了,可以採取以下方法;
3. 非延遲單例模式
package creationalPattern.singleton.singleton_3;
/**
* 單例模式(非延遲(eagerly)創建)
* @author Liyongbin
* @adte 2011-02-06
*
*/
public class Singleton {
//私有的類成員
private static Singleton uniqueInstance=new Singleton();
//私有的構造器
private Singleton(){};
//全局的訪問點
public static Singleton getInstance(){
return uniqueInstance;
}
}
4. 使用雙重檢查來確保單例的安全,高效運行
package creationalPattern.singleton.singleton_4;
/**
* 單例模式((非延遲(eagerly)創建)使用雙重检查機制--volatile
* 優化性能,大大地減少getInstance()時間耗費
* @author Liyongbin
* @adte 2011-02-06
*/
public class Singleton {
//私有的類成員
private volatile static Singleton uniqueInstance;
//私有的構造器
private Singleton(){};
//全局的訪問點
//检查实例,不存,就進入同步塊
public static Singleton getInstance(){
//只有第一次才徹底執行這里的代碼
if (null==uniqueInstance) {
synchronized (Singleton.class){
//進入同步塊后,再檢查一次,為null才創建實例
if (null==uniqueInstance) {
uniqueInstance=new Singleton();
}
}
}
return uniqueInstance;
}
}
注:此方法僅適用于JDK1.4或更高的版本