@[toc]
什麼是單例
保證一個類只有一個實例,並且提供一個訪問該全局訪問點
1.Windows的Task Manager(任務管理器)就是很典型的單例模式
2.windows的Recycle Bin(回收站)也是典型的單例應用。在整個系統運行過程中,回收站一直維護著僅有的一個實例
3.數據庫連接池,線程池,spring(默認單例模式)都是單例
為什麼要設計成單例 ?單例的好處?優缺點?
**單例好處:節約內存,只有一個實例,重複利用,方便管理
缺點:線程安全問題**
單例創建方式
**1.餓漢式:類初始化時,會立即加載該對象,線程天生安全,調用效率高。
2.懶漢式: 類初始化時,不會初始化該對象,真正需要使用的時候才會創建該對象,具備懶加載功能。
3.靜態內部方式:結合了懶漢式和餓漢式各自的優點,真正需要對象的時候才會加載,加載類是線程安全的。
4.枚舉單例: 使用枚舉實現單例模式 優點:實現簡單、調用效率高,枚舉本身就是單例,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞, 缺點沒有延遲加載。**
1.餓漢式實現
2.懶漢式實現
3.枚舉創建單例
枚舉--定義常量,天生具備JVM保障單例,一般項目定義常量
package com.dimple.Design;
public class SinEnum {
private SinEnum(){
}
public static SinEnum getInstance() {
return sinEnumPattern.INSTANCE.getInstance();
}
private static enum sinEnumPattern {
INSTANCE;
// 枚舉元素為單例
private SinEnum sinEnum;
private sinEnumPattern() {
sinEnum = new SinEnum();
}
public SinEnum getInstance() {
return sinEnum;
}
}
public static void main(String[] args) {
SinEnum u1 = SinEnum.getInstance();
SinEnum u2 = SinEnum.getInstance();
System.out.println(u1 == u2);
}
}
如何選擇單例創建方式
如果不需要延遲加載單例,可以使用枚舉或者餓漢式,相對來說枚舉性好於餓漢式。
如果需要延遲加載,可以使用靜態內部類或者懶韓式,相對來說靜態內部類好於懶韓式。