Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android SDK源碼之單例模式

Android SDK源碼之單例模式

編輯:關於android開發

  單例模式,可以說是GOF的23種設計模式中最簡單的一個。
  這個模式相對於其他幾個模式比較獨立,它只負責控制自己的實例化數量單一(而不是考慮為用戶產生什麼樣的實例),很有意思,是一個感覺上很干淨的模式,本人很喜歡這個模式。
  android中很多地方都用到了單例模式,本文以輸入法管理者InputMethodManager為例,展開分析。
  單例模式,Singleton Pattern,能夠以其特有的優勢,替代系統中全局變量,應用非常廣泛。

  1.意圖
  保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
  熱門詞匯:單例 唯一 私有構造

  2.結構

  android中有很多系統級別的全局變量,如時間,輸入法,賬戶,狀態欄等等,android中對這些都直接或者有些間接用到了單例模式。

  以輸入法為例,把上圖修改為實際情況:

  非常的簡單,但是有一點,從上面我們也看到了synchronized關鍵字,在多線程的環境下,單例模式為了保證自己實例數量的唯一,必然會做並發控制。
  類似這種線程安全的單例,跨進程的單例,參數化的單例等等的情況,確實超出本文的范圍,而且都涉及到很多東西,是一個很大的話題,不好展開。

  3. 代碼

  public final class InputMethodManager {

      static final Object mInstanceSync = new Object();//同步

      //內部全局唯一實例

      static InputMethodManager mInstance; 

      //對外api

      static public InputMethodManager getInstance(Context context) {

          return getInstance(context.getMainLooper());

      }    

      /**

       * 內部api,供上面的外部api調用

       * @hide 系統隱藏的api

       */

      static public InputMethodManager getInstance(Looper mainLooper) {

          synchronized (mInstanceSync) {

              if (mInstance != null) {

                  return mInstance;

              }

              IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);

              IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);

              mInstance = new InputMethodManager(service, mainLooper);

          }

          return mInstance;

      }

  }

  客戶端調用,比如contextimpl中的getSystemService()方法中如下調用:

  class ContextImpl extends Context{

      @Override

      public Object getSystemService(String name) {

          if (WINDOW_SERVICE.equals(name)) {

              //... ... 省略下面n個if,else if

          } else if (INPUT_METHOD_SERVICE.equals(name)) {

              //獲取輸入法管理者唯一實例

              return InputMethodManager.getInstance(this);

          }  else if (KEYGUARD_SERVICE.equals(name)) {

               //... ... 省略下面n個if,else if

          } else if (ACCESSIBILITY_SERVICE.equals(name)) {

              //又見單例,無處不在

              return AccessibilityManager.getInstance(this);

          } else if (LOCATION_SERVICE.equals(name)) {

              //... ... 省略下面n個if,else if

          }  else if (NFC_SERVICE.equals(name)) {

              return getNfcManager();

          }

          return null;

      }

  }

  非常簡單,干淨的一個模式。

  4.效果

  創建型模式。
  對唯一實例的受控訪問。
  避免全局變量污染命名空間。
  允許對操作和表示的精化。
  比類操作更靈活。

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