什麼是單例模式
單例模式是一種設計模式,目的是為了確保某個類別只有一個實例,並自行實例化且整個系統都可以訪問。
單例模式的適用場景
提供全域可以訪問的對象(例如可以用作全域變數使用)
工具類別
耗費資源的對象(例如呼叫web api、資料庫連接管理)
Java的實現方式
- 宣告一個名為instance的物件
- 呼叫getInstance()方法的時候,如果instance = null則實例化一個自己
- 進行實例化的建構式必須是私有的(private),防止被其他人重複實例化。
程式碼如下所示:
public class Singleton {
private Singleton() {}
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null) instance = new Singleton();
return instance;
}
}
以上是Java單例模式簡單的實現方式。
但如果在多執行緒的情境下訪問該物件,可能會發生資料不同步的問題,因此我們可以這樣改:
public class Singleton {
private Singleton() {}
private static Singleton instance = null;
private synchronized static void createInstance() {
if (instance == null) instance = new Singleton();
}
public static Singleton getInstance() {
if (instance == null) createInstance();
return instance;
}
}
上面的程式碼,在實例化的時候使用synchronized修飾詞來保護createInstance()這個方法,保證同一時間只有一個執行緒呼叫該方法。
以上就是Java實現單例模式的方式。
Kotlin的實現方式
Kotlin的實現方式就很簡單了,只需要用object關鍵字宣告就可以實現單例模式:
object Singleton() {
}
在Kotlin官方文件中,這種做法也叫做Object declarations。
讓我們來反編譯看看。
首先點選Android Studio的Tool menu->Kotlin->Show Kotlin Bytecode
接著在右側Kotlin Bytecode視窗中,按下Decompile
最後就會得到反編譯成Java原始碼的結果,如下:
public final class Singleton {
public static final Singleton INSTANCE;
private Singleton() {
INSTANCE = (Singleton)this;
}
static {
new Singleton();
}
}
怎麼樣,是不是跟Java一模一樣呢~
事實上,object實際上也是建立了唯一的實例,只不過是由Kotlin自動幫你完成了。