Java中單例模式定義:一個類有且僅有一個實例,並且自行實例化向整個系統提供。
要點:一是某個類只能有一個實例,二是它必須自行創建這個實例,三是它必須自行向整個系統提供這個實例。
實現:一是類只提供私有的構造函數,二是類定義中含有一個該類的靜態私有對象,三是該類提供了一個靜態的共有的函數用於創建或獲取它本身的靜態私有對象。單例模式一共有5種實現方式:懶漢,惡漢,雙重校驗鎖,枚舉和靜態內部類。這裏舉前面2種來展示單例模式:
懶漢單例模式
public class Singleton {
/*
* 懶漢單例模式:只有在第一次請求實例的時候創建,並且只在第一次創建後,以後不再創建該類的實例
*/
// 1.一個私有的指向自己的靜態變量
private static Singleton instance;
// 2.私有的構造方法,保證不能從外部創建對象
private Singleton() { }
// 3.公開的靜態工廠方法,返回該類的唯一實例(當發現沒有實例沒有初始化的時候才初始化)
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
這種寫法能夠在多線程中很好的工作,而且看起來它也具備很好的lazy loading,但是效率很低,99%情況下不需要同步。
餓漢單例模式
public class Singleton2 {
/*
* 惡漢單例模式:在類加載的時候就創建一個單例模式.
*/
// 1.私有的構造函數,確保不能在類的外部訪問該類的構造函數
private Singleton2() { }
// 2.私有的唯一的靜態實例變量,在類加載的時候就創建好單例對象
private final static Singleton2 instance = new Singleton2();
// 3.公開的靜態工廠返回此類的唯一實例
public static Singleton2 getInstance(){
return instance;
}
}
這種寫法基於classloder機制避免了多線程的同步問題
(2014-05-14 上午)