單例模式(Singleton Pattern)
是設計模式中最簡單也最常見的一種。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在單例模式中,一個類只有一個例項存在,同時該類的例項由一個預先定義好的靜態引用變數所持有,以便在整個系統中隨時訪問它。
模式結構與角色
- 單例類(Singleton):擁有一個私有的靜態成員變數來儲存單例例項,擁有一個私有的構造器防止被例項化,提供一個公有的靜態方法來獲取該類的唯一例項。
工作原理
單例模式透過以下步驟來確保一個類只有一個例項並且這個例項易於被訪問:
- 私有構造器:將類的構造器私有化,防止外部程式碼透過new關鍵字建立該類的例項。
- 靜態私有成員變數:在類內部定義一個靜態的私有成員變數來儲存該類的唯一例項。
- 公有靜態方法:提供一個公有的靜態方法來獲取該類的唯一例項。該方法首先會檢查靜態成員變數是否已經儲存了類的例項,如果已經儲存則直接返回該例項;否則建立一個新的例項並儲存到靜態成員變數中,然後返回該例項。
優點
- 控制資源訪問:透過單例模式可以確保系統中對某個類的例項只有一個,從而控制對該類資源的訪問。
- 減少全域性變數:在不需要頻繁建立和銷燬物件的情況下,使用單例模式可以減少記憶體開銷,提高系統效能。
- 簡化訪問:單例模式提供了一個全域性訪問點,使得系統更容易訪問和使用該類的例項。
缺點
- 擴充套件性差:由於單例模式限制了類的例項化,因此很難對其進行擴充套件和修改。
- 濫用可能導致問題:如果濫用單例模式,可能會導致系統中過多的單例類,增加系統的複雜性和維護成本。
- 實現方式
- 單例模式有多種實現方式,包括餓漢式(靜態常量)、餓漢式(靜態程式碼塊)、懶漢式(執行緒不安全)、懶漢式(執行緒安全,同步方法)、懶漢式(雙重檢查鎖定/DCL,即執行緒安全,同步程式碼塊)、靜態內部類、列舉等。其中,列舉方式是最推薦的實現方式,因為它既簡單又安全。
示例程式碼(Java,使用列舉方式)
public enum Singleton {
INSTANCE;
// 其他方法或屬性
public void doSomething() {
// ...
}
// 獲取單例物件的靜態方法
public static Singleton getInstance() {
return INSTANCE;
}
}
// 客戶端程式碼
public class Client {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
singleton.doSomething();
}
}