Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android與設計模式——單例(Singleton)模式

Android與設計模式——單例(Singleton)模式

編輯:關於Android編程

概念:
  java中單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
  單例模式有一下特點:
  1、單例類只能有一個實例。
  2、單例類必須自己自己創建自己的唯一實例。
  3、單例類必須給所有其他對象提供這一實例。

  單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。在計算機系統中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中。每台計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。(此段來源與網絡)

單例模式在Android源代碼中使用的很廣泛,在我熟悉的Telephony模塊就用到了不少,比如說SIM卡的管理UiccController,電話管理CallManager等。下面看看單例模式的基本模型:

\

懶漢式單例:

public final class CallManager {
     .......
    // Singleton instance
    private static final CallManager INSTANCE = new CallManager();
      .......
    /**
     * get singleton instance of CallManager
     * @return CallManager
     */
    public static CallManager getInstance() {
        return INSTANCE;
    }
    .......
    private CallManager() {
    .......
    }
    .......
}

此例使用時直接用CallManager.getInstance()調用即可獲得CallManager實例。


餓漢式單例:

public class UiccController extends Handler {
    ......
    private static UiccController[] mInstance = {null, null, null, null};
    ......
    public static UiccController make(Context c, CommandsInterface ci, int simId) {
        synchronized (mLock) {
            if (FeatureOption.MTK_GEMINI_SUPPORT) {
                if(mInstance[simId] != null) {
                    throw new RuntimeException("UiccController.make() should only be called once");
                }
                mInstance[simId] = new UiccController(c, ci, simId);
                return mInstance[simId];
            } else {
                if (mInstance[0] != null) {
                    throw new RuntimeException("UiccController.make() should only be called once");
                }
                mInstance[0] = new UiccController(c, ci);
                return mInstance[0];
            }
        }
    }
    ......
    public static UiccController getInstance(int simId) {
        synchronized (mLock) {
            if (FeatureOption.MTK_GEMINI_SUPPORT) {
                if(mInstance[simId] == null) {
                    throw new RuntimeException(
                        "UiccController.getInstance can't be called before make()");
                }
                return mInstance[simId];
            } else {
                if (mInstance[0] == null) {
                    throw new RuntimeException(
                        "UiccController.getInstance can't be called before make()");
                }
                return mInstance[0];
            }
        }
    }
    ......
    private UiccController(Context c, CommandsInterface ci, int simId) {
    ......
    }
    ......

}


此例使用時,先UiccController.make()創建實例,然後UiccController.getInstance()獲取實例。


登記式單例:

暫時沒找到例子。。。


未完待續,有不對的地方,請指正。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved