確保您擁有一個獨一無二的例項:單例模式的建立方式

张哥说技术發表於2024-03-07

來源:程式設計師wayn

理解單例模式

單例模式是一種建立模式,旨在保證一個類在應用程式的生命週期內只有一個例項,並提供一個全域性訪問點。這意味著當您嘗試建立一個類的多個物件時,實際上您得到的是同一個例項。單例模式保證了一致的狀態,降低了記憶體開銷,並可以在系統的任何地方使用相同的物件例項。

餓漢式單例

餓漢式單例在類載入時就完成了例項的初始化。由於靜態變數的建立是執行緒安全的,這種方式自然不涉及多執行緒問題,簡單實用。然而,它的缺點是,若該例項過早建立,可能會導致資源的浪費。

public class Singleton {
// 在類初始化時立即載入這個物件,天生執行緒安全
private static final Singleton INSTANCE = new Singleton();

private Singleton() {}

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

懶漢式單例

相對於餓漢式,懶漢式單例推遲了例項的建立,提供了延遲載入的優勢。這是透過在方法呼叫時,才建立例項來實現的。但這種方式必須處理多執行緒環境下的併發訪問,通常需要使用同步機制來保證執行緒安全。

public 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;
}
}

靜態內部類單例

靜態內部類單例模式結合了餓漢式的執行緒安全性和懶載入的資源優勢。只有在第一次使用 getInstance 方法時,才會載入 SingletonHolder 類,這樣就完成了 Singleton 的例項建立。

public class Singleton {

private Singleton() {}

private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}

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

列舉單例

列舉單例是實現單例模式的最佳方法之一。它不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件。

public enum Singleton {
INSTANCE;

public void someMethod() {
// perform some actions
}
}

選擇正確的單例模式

當你決定使用單例模式時,應該基於具體情況來選擇實現方式:

  • 如果應用程式總是需要使用單例的例項,或者單例的建立開銷不大時,餓漢式單例是一個不錯的選擇。
  • 如果單例的建立成本高,或者希望延遲其建立,應當考慮懶漢式單例。
  • 靜態內部類單例為我們提供了延遲載入和執行緒安全的建立方式,它是實現單例模式的一個優雅選擇。
  • 如果您需要維護單例的狀態,並且對於序列化有要求,列舉單例模式將是最佳選擇。

總結

單例模式透過確保一個類有且僅有一個例項,並提供一個訪問此例項的全域性訪問點,幫助我們控制物件的建立和資源消耗。瞭解不同的單例模式實現方式及其適用場景對於設計一個穩健、可維護的系統是至關重要的。審慎選擇,可以讓單例模式成為您軟體架構中的寶貴資產。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024923/viewspace-3008325/,如需轉載,請註明出處,否則將追究法律責任。

相關文章