單例模式
單例(Singleton)模式的定義:指一個類只有一個實例,且該類能自行創建這個實例的一種模式。例如,Windows 中只能打開一個任務管理器,這樣可以避免因打開多個任務管理器窗口而造成內存資源的浪費,或出現各個窗口顯示內容的不一致等錯誤。
單例模式的特點
- 單例類只有一個實例對象;
- 該單例對象必須由單例類自行創建;
- 單例類對外提供一個訪問該單例的全局訪問點
單例模式實例
1.懶漢式
懶漢式是指在第一次使用這個類的對象時才創建這個類的實例。
public class Singleton {
private static volatile Singleton singleton;
private Singleton(){ }
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
先私有化構造函數,讓外部無法通過構造函數來實例化一個類。再聲明一個私有的該類對象,並設置爲static的目的是保證該實例屬於類,設置volatile的目的是保證多線程種共享該對象。再設置一個外部訪問函數getInstace
,首先對該實例對象做初始化處理再返回該對象。並設置synchronize加上線程鎖,保證線程安全。
使用方法:
Singleton singleton = Singleton.getInstance();
即可在任意地方返回該類的唯一對象。
2.餓漢式
餓漢式指的是在類創建過程中(詳細說法是類加載過程該對象就已經創建再常量池中的引用指向堆中)就已經存在。
public class Singleton1 {
private static final Singleton1 singleton1 = new Singleton1();
private Singleton1(){ }
public static Singleton1 getInstance(){
return singleton1;
}
}
同樣私有化構造函數,並創建一個該類的實例並設置爲final,目的是保證該類在多線程環境下線程安全。(原因是:當此對象設置爲final時,在類加載時,該對象就已經存在於堆中,且常量池中有一引用類型singleton1指向該類,由於常量池和堆是線程共享的,所以多線程情況下線程均能訪問,對此保證了線程安全),再設置一個入口函數,返回該實例對象。
使用方法同上。
單例模式的應用場景
- 在應用場景中,某類只要求生成一個對象的時候,如一個班中的班長、每個人的身份證號等。
- 當對象需要被共享的場合。由於單例模式只允許創建一個對象,共享該對象可以節省內存,並加快對象訪問速度。如 Web 中的配置對象、數據庫的連接池等。
- 當某類需要頻繁實例化,而創建的對象又頻繁被銷燬的時候,如多線程的線程池、網絡連接池等。