確保您擁有一個獨一無二的例項:單例模式的建立方式
來源:程式設計師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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 確保物件的唯一性——單例模式 (二)物件單例模式
- 單例模式 - 只有一個例項單例模式
- 確保物件的唯一性——單例模式 (五)物件單例模式
- 確保物件的唯一性——單例模式 (四)物件單例模式
- 確保物件的唯一性——單例模式 (三)物件單例模式
- 您的單例模式,真的單例嗎?單例模式
- Python 建立單例模式的三種方式Python單例模式
- 設計模式系列之單例模式(Singleton Pattern)——確保物件的唯一性設計模式單例物件
- 如何建立一個新的SQL Server例項SQLServer
- c#如何只能建立類的一個例項(一)C#
- 美團一面:會單例模式嗎,寫個單例看看?(8大單例模式實現方式總結)單例模式
- javascript如何建立一個物件例項JavaScript物件
- frida 建立一個ArrayList例項
- 設計模式(一)建立型之單例模式設計模式單例
- 一天一個設計模式(二) - 單例模式(Singleton)設計模式單例
- 如何寫出一個好的單例模式單例模式
- oracle手動建立另外一個例項Oracle
- 建立型模式之單例模式與工廠模式(一)模式單例
- 設計模式(三)----建立型模式之單例模式(一)設計模式單例
- 單例模式的正確寫法單例模式
- 【C++】實現一個簡單的單例模式C++單例模式
- java反射方式建立例項Java反射
- 為同一個資料庫建立新的例項資料庫
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- 建立型模式:單例模式模式單例
- 建立型模式————單例模式模式單例
- 設計模式學習(一)單例模式的幾種實現方式設計模式單例
- 單例模式 - 確定 N 先生的GrilFriend單例模式
- JavaScript單例模式概念與例項JavaScript單例模式
- JS 建立例項物件的四種模式JS物件模式
- 設計模式一(單例模式)設計模式單例
- 設計模式(一)_單例模式設計模式單例
- PHP封裝的一個單例模式Mysql操作類PHP封裝單例模式MySql
- 在EntityFramework6中管理DbContext的正確方式(4)【DbContextScope:一個簡單的,正確的並且靈活的管理DbContext例項的方式】FrameworkContext
- 每天一個設計模式之單例模式設計模式單例
- 建立者模式之單例模式模式單例