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()擷取執行個體。
登記式單例:
暫時沒找到例子。。。
未完待續,有不對的地方,請指正。