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

來源:互聯網
上載者:User

Android與設計模式——單例(Singleton)模式,androidsingleton
概念:
  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()擷取執行個體。


登記式單例:

暫時沒找到例子。。。


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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.