1.概述
- 什麼是單例模式
定義:確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例 - 單例模式包括:
1.私有的構造方法
2.指向自己實例的私有靜態引用
3.以自己實例爲返回值的靜態的公有方法
2.實現單例模式的兩種方法
單例模式根據實例化對象時機的不同分爲兩種:一種是餓漢單例模式,一種是懶漢單例模式。餓漢單例模式在單例類被加載的時候,就實例化一個對象交給自己使用;懶漢單例模式在調用取得實例方法的時候纔會實例化對象。
(1)餓漢單例模式
public class Single {
private Single(){} //私有構造方法
private static final Single s = new Single(); //指向自己實例的私有靜態引用
public static Single getInstance(){ //以自己實例爲返回值的靜態的公有方法
return s;
}
}
public static void main(String[] args){
Single s = Single.getInstance();
}
(2)懶漢單例模式
public class Single {
private Single(){} //私有構造方法
private static Single s = null; //指向自己實例的私有靜態引用
public static Single getInstance(){ //以自己實例爲返回值的靜態的公有方法
if(s == null){
s = new Single();
}
return s;
}
}
public static void main(String[] args){
Single s = Single.getInstance();
}
3.單例模式的優點
- 在內存中只有一個對象,節省內存空間
- 避免繁瑣的創建銷燬對象,可以提高性能
- 避免對共享資源的多重佔用
- 可以全局訪問
4.單例模式使用場景
- 需要頻繁實例化然後銷燬的對象
- 創建對象時耗時過多或者耗資源過多,但又經常用到的對象
- 有狀態的工具類對象
- 頻繁訪問數據庫或文件的對象
- 只有一個對象的場景
5.單例模式注意事項
- 只能使用單例類的方法得到單例對象,不要使用反射,否則將會實例化一個新對象
- 不要做斷開單例對象與類中靜態引用的危險操作
- 多線程使用單例模式共享資源時,注意線程安全問題
懶漢單例模式線程安全問題:
public class Single {
private Single(){} //私有構造方法
private static Single s = null; //指向自己實例的私有靜態引用
public static Single getInstance(){ //以自己實例爲返回值的靜態的公有方法
if(s == null) { //提高程序的執行效率,已經創建了就不用再創建
synchronized (Single.class) { //加synchronized關鍵字防止再次創建對象
if (s == null) {
s = new Single();
}
}
}
return s;
}
}