Home >> Blog >> 什麼是singleton單例模式?

什麼是singleton單例模式?

什麼是單例?

介紹

SEO周邊軟體的開發過程中你會遇到singleton單例模式,單例設計模式將類的實例化限制為單個實例。這樣做是為了在整個軟件系統中提供對特定資源的協調訪問。通過這種設計模式,單例類確保它只被實例化一次,並且可以提供對單個實例的輕鬆訪問。

用例

單例設計模式的常見用例包括工廠、構建器和保存程式狀態的對象。

單例有時被認為是全局變量或靜態類的替代品。

與全局變量相比,單例有以下好處:

  • 單例實例字段不佔用全局命名空間中的空間
  • 單例可能會延遲初始化(待進一步討論)

主要是因為單例擁有一個實例化的對象,而靜態類沒有,單例比靜態類具有以下優點:

  • 單例可以實現接口
  • 單例可以作為參數傳遞
  • 單例可以交換它們的實例(例如用於測試目的)
  • 單例可以多態處理,因此可能存在多個實現

執行

讓我們看一下Java中一個基本單例類的實現細節。單例通常使用私有構造方法和公共靜態方法來實現,以返回單例的實例——存儲在私有靜態最終變量中。

有兩種類型的單例實現:急切和延遲初始化。它們在初始化單例實例的方式上有所不同。我們還必須考慮它們中的每一個的執行緒安全性。

渴望初始化

在這個版本中,單例實例是在初始化單例變量時創建的,而不是在第一次使用時創建的。由於此時單例在程式執行中沒有任何用處,它可能會不必要地消耗系統資源。如果單例實例計算成本高或占用大量資源,則可能會降低系統性能。然而,這個版本是執行緒安全的。

public final class Singleton {

private static final Singleton INSTANCE = new Singleton();

private Singleton() {}

public static Singleton getInstance() {
return INSTANCE;
}
}

延遲初始化

在這個版本中,單例實例是在getInstance第一次調用靜態方法時創建的。這確保了單例實例僅在絕對必要時才消耗系統資源。

public final class Singleton {

private static Singleton instance = null;

private Singleton() {}

public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

執行緒安全的延遲初始化

上面顯示的延遲初始化版本不是執行緒安全的。在具有多個執行緒的程式中,可以多次創建單例實例,所有執行緒都Singleton同時使用該類。如果單例對象的創建成本很高,這可能會消耗大量可用的系統資源。此外,這可能導致執行緒接收部分創建的單例對象。

通過使用同步,以下實現是執行緒安全的。該instance變量現在也被聲明為volatile,這確保所有執行緒都具有單例實例的更新視圖。

public final class Singleton {

private static volatile Singleton instance = null;

private Singleton() {}

public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}

return instance;
}
}