Java設計模式之-單例設計模式
什么是單例模式
單例模式是一種設計模式,它保證在一個應用程序的上下文中,我們只創(chuàng)建一個類的單一實例。這個類必須自我實例化并向整個系統(tǒng)提供這個實例。
主要解決什么問題
單例模式主要解決的是資源共享和控制共享資源的問題。當我們希望避免對某個類的頻繁創(chuàng)建和銷毀而帶來的大量性能開銷,或者希望確保所有的請求都訪問同一個實例,以便更好地協(xié)調(diào)操作時,就可以使用單例模式。
在什么時候我們需要使用單例模式
當我們需要控制實例數(shù)目,節(jié)約系統(tǒng)資源的時候;當一個類只允許創(chuàng)建一個對象時,比如一個系統(tǒng)只能有一個窗口管理器,或者在一個系統(tǒng)中只能有一個計時工具等情況下,就需要使用單例模式。
生活中的應用實例
一個生活中的例子可能是總統(tǒng)或首相的角色。在一個國家中,總統(tǒng)或首相在任何特定時間只能有一個。這個人負責做出決策并控制資源。
優(yōu)點
在內(nèi)存里只有一個實例,減少了內(nèi)存開銷。
避免對資源的多重占用。
可以全局訪問。
缺點
沒有接口,擴展困難。
如果要擴展單例對象,只有修改代碼,不能遵循“開閉原則”。
使用場景
需要頻繁實例化然后銷毀的對象。
創(chuàng)建對象時耗時過多或耗資源過多,但又經(jīng)常用到的對象。
需要定義大量的靜態(tài)變量和靜態(tài)方法的環(huán)境,類似全局變量和全局函數(shù)的場景。
代碼舉例
以下是一個簡單的單例模式的Java代碼實現(xiàn):
java
Copy
public class Singleton {
? ? // 在自己內(nèi)部定義自己一個實例
? ? private static final Singleton INSTANCE = new Singleton();
? ? // 私有化構(gòu)造函數(shù),外部無法訪問
? ? private Singleton() {}
? ? // 對外提供獲取實例的靜態(tài)方法
? ? public static Singleton getInstance() {
? ? ? ? return INSTANCE;
? ? }
}
這就是一個最簡單的單例模式實現(xiàn),這種方式稱為餓漢式單例,即類一旦加載,就試圖在自己的內(nèi)存中創(chuàng)建一個實例。這種方式簡單直接,在多線程環(huán)境下也能保證單例。但缺點是無法做到延遲實例化。