單例模式:最簡單的一種設計模式
單例模式,確保一個類只有一個實例,並且自行實例化並向整個系統提供這個實例
java中有兩種單例模式:餓漢式(加載時候就會實例化) 懶漢式(第一次引用時候才進行實例化)
餓漢式:
在類被加載時候 ,靜態變量singLeton會被初始化,調用私有的構造器創建唯一的singLeton實例,提供一個私有的構造方法,以及提供一個公共的返回實例的引用
public class SingLeton {
public int count = 0;
static SingLeton singLeton = new SingLeton();
private SingLeton() {
}
public static SingLeton getInsance() {
return singLeton;
}
}
餓漢式: 返回實例的方法需要同步synchroized 否則 多線程狀態下 會出現多個實例
public class SingLetonLh {
private SingLetonLh() {
}
private static SingLetonLh singLeton = null;
public static synchronized SingLetonLh getInternec() {
if(singLeton == null) {
singLeton = new SingLetonLh();
}
return singLeton;
}
}
餓漢式與懶漢式的區別
1、餓漢式單例實例 被加載時候就會創建,懶漢式則是第一次調用的時候纔會初始化
2、從資源利用效率上說 懶漢式要差一些,但是從反應速度上和反應時間上講,餓漢式要比懶漢式稍好些
3、餓漢式 更符合java語言特點
單例模式的應用:
單例模式的優點:減少內存開支,特別是對一個對象需要頻繁的創建,銷燬,減少了性能開銷,當一個對象的產生需要比較多資源,如讀取配置文件信息等 可以在啓用時 直接產生一個對象,然後永久駐留內存的方式來解決
單例模式的缺點:無法創建子類,對測試不利,與單一職責原則衝突
單例模式的使用場景:
一個系統中如果要求一個類有且僅有一個實例,當出現多個實例的時候就會哦造成不良反應的時候 就考慮使用單例模式
要求生成唯一序列號的環境
在整個項目中需要一個共享訪問或者共享數據
創建一個對象需要小號過多的資源 如訪問io和數據庫等資源
需要定義大量的靜態常亮,和靜態方法的環境,可以採用單例模式
使用單例的注意事項:
當系統爲多jvm分佈式 或者一個jvm有多個類加載器 應避免使用有狀態單例(當做狀態庫使用)
如果一個類實現了cloneAble serializable接口 則有可能反序列化或克隆出一個新的實例類 因此單例不需要實現cloneAble serializable接口