單例模式(Singleton Pattern):
定義:Ensure a class has only instance , and provide a global point of access to it.(確保某一個類只有一個實例,而且自動實例化並向整個系統提供這個實例)
優點:
1、在內存中只有一個實例,所以減少了內存開銷,特別是在一個對象需要頻繁地創建、銷燬時,而且創建或銷燬時性能又無法優化。單例模式的優勢非常明顯;
2、避免對資源的多重佔用。例如寫文件動作,由於只有個實例存在內存中,避免對同一個資源文件的同時寫操作
3、提供了對唯一實例的受控訪問。
4、允許可變數目的實例。
缺點:
1、沒有接口,擴展困難。
2、不適用於變化的對象,如果同一類型的對象總是要在不同的用例場景發生變化,單例就會引起數據的錯誤,不能保存彼此的狀態。
3、濫用單例將帶來一些負面問題,如爲了節省資源將數據庫連接池對象設計爲的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認爲是垃圾而被回收,這將導致對象狀態的丟失。
4、單例類的職責過重,在一定程度上違背了“單一職責原則”。
適用場景:
1、資源共享的情況下,避免由於資源操作時導致的性能或損耗等。如上述中的日誌文件,應用配置。
2、控制資源的情況下,方便資源之間的互相通信。如線程池等。
3、需要定義大量的靜態常量和靜態方法(如工具類)的環境,可以採用單例模式
UML圖:
單例模式的幾種書寫方式:
1.餓漢式單例:單例實例在類裝載時就構建 ,
特點:線程安全 在類加載的同時已經創建好一個靜態對象,調用時反應速度快
public class SingletonPattern()
{
private static SingletonPattern singleton = new SingletonPattern();
private SingletonPattern()
{
}
//通過該方法獲得實例對象
public static SingletonPattern GetSingleton()
{
return singleton;
}
}
2、懶漢式單例:單例實例在第一次被使用時構建,延遲初始化
特點: 避免了餓漢式的那種在沒有用到的情況下創建事例,資源利用率高,不執行getInstance()就不會被實例,可以執行該類的其他靜態方法。但是多個線程判斷instance都爲null時,在執行new操作時多線程會出現重複情況
public class SingletonPattern()
{
private static SingletonPattern singleton = null;
private SingletonPattern()
{
}
//通過該方法獲得實例對象
public static SingletonPattern GetSingleton()
{
if(singleton == null)
{
//多個線程判斷instance都爲null時,在執行new操作時多線程會出現重複情況
singleton = new SingletonPattern ();
}
return singleton;
}
}
3、雙重檢測單例:
特點: 資源利用率高,不執行getInstance()就不被實例,可以執行該類其他靜態方法 但是第一次加載時反應不快
public class SingletonPattern()
{
private static SingletonPattern singleton = null;
private SingletonPattern()
{
}
//通過該方法獲得實例對象
public static SingletonPattern GetSingleton()
{
if(singleton == null)
{
//使用synchronized關鍵字,防止多個線程判斷instance都爲null時,在執行new操作時多線程會出現重複情況
synchronized (SingletonPattern.class) {
if (instance == null) {
instance = new SingletonPattern();
}
}
}
return singleton;
}
}
4、靜態內部類模式:
public class SingletonPattern()
{
private SingletonPattern()
{
}
private static class SingletonHelp()
{
static SingletonPattern singleton = new SingletonPattern();
}
//通過該方法獲得實例對象
public static SingletonPattern GetSingleton()
{
return singleton;
}
}
好了,這一章就寫到這,歡迎大家加入QQ羣:280993838 。或者關注我的公衆號: