定義:
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
作用:
我的理解:單例,單例,就像“三代單傳”一樣,肯定是當寶貝一般的。不讓亂改的。
分析:
根據定義分析出如下要點:
1. 某個類只能有一個實例
2. 它必須自行創建這個實例
3. 它必須自行向整個系統提供這個實例
說人話就是具體實現為以下幾點:
1. 只提供私有構造方法
2. 類定義中含有一個該類的靜態私有對象
3. 該類提供一個靜態的公有的函數用于創建或獲取它本身的靜態私有對象
注:代碼實現中的 1 2 3 數字分別對應這三條
Java代碼實現:
非延遲加載單例 —— 餓漢式
public class Singleton {
// 2
private static final Singleton instance = new Singleton();
// 1
private Singleton() {
}
// 3
public static Singleton getInstance() {
return instance;
}
}
優點:線程安全、簡單
缺點:當程序啟動,類加載后就創建了,一直占著內存,直到。。。
延遲加載單例 —— 靜態內部類實現
public class Singleton {
private static class SingletonHolder {
// 2
private static final Singleton instance = new Singleton();
}
// 1
private Singleton() {
}
// 3
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
優點:延遲加載,節省內存,線程安全
上面兩種實現方式,是在不使用 反射 的情況下,才會得到保證。
非延遲加載 —— 枚舉
public enum Singleton {
INSTANCE; // 1 2 3
}
優點:哎,反射不好使。
缺點:當程序啟動,類加載后就創建了,一直占著內存,直到。。。
參考:
- http://blog.csdn.net/goodlixueyong/article/details/51935526
- http://blog.csdn.net/jason0539/article/details/23297037
- http://www.iteye.com/topic/652440
- http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html
- https://baike.baidu.com/item/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/5946627?fr=aladdin
=========================== 分 割 線 =============================
還有一種懶漢式的單例實現,但是看到網上分析說,很多實現是有問題的,又才疏學淺,不敢亂寫,遂棄之。