大家好,javaRush!
今天跟大家講一下設計模式
Singleton
(單)。
目標:建立一個只有一個物件的類別。這意味著無論訪問多少次,都會傳回第一次建立的同一個物件。這是一件很方便的事情,在很多地方都是必要的,它被實現到框架中並不是沒有原因的。
應用:
- 例如,您需要將資料庫連接到專案以及負責連接到該專案的類別。連接創建一次,無需多次創建
Application settings
— 負責應用程式所需的連線設定的類別:資料庫主機和連接埠等。它們創建一次並在應用程式的整個操作過程中使用。
- 還有很多我沒有提到的例子,所以請在評論中寫下你的選擇!=)
在這個介紹之後,據我了解,我們可以展示這個類別的一個例子:(儘管我相信我們每個人都可以想出這個類別的實現)這是最簡單的例子,當我們將構造函數設為私有時,即 您無法明確建立物件。並且有一個
getInstance()
提供物件的靜態方法。
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
多執行緒有問題,那麼可以放一個
getInstance()
標記方法
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
最後,像往常一樣,我想說,如果你有不同的想法或發現我的錯誤,請寫在評論中!我們將愉快地討論一切:)如果您喜歡這篇文章,請寫“+”,我會知道的。這對我來說很重要:) PS 我正在添加更多實現:根據
Joshua Bloch 的說法,這是實現模板的最佳方式
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
並進一步
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
延遲初始化
+
高效
-
能不能用於非靜態類別欄位 任何問題/建議 - 寫在評論中!
另請參閱我的其他文章:
GO TO FULL VERSION