技術學習記錄

[Android]單例模式

什麼是單例模式

單例模式是一種設計模式,目的是為了確保某個類別只有一個實例,並自行實例化且整個系統都可以訪問。

單例模式的適用場景

提供全域可以訪問的對象(例如可以用作全域變數使用)

工具類別

耗費資源的對象(例如呼叫web api、資料庫連接管理)

Java的實現方式

  1. 宣告一個名為instance的物件
  2. 呼叫getInstance()方法的時候,如果instance = null則實例化一個自己
  3. 進行實例化的建構式必須是私有的(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自動幫你完成了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *