Android設計模式系列(3)–SDK源碼之單例模式

來源:互聯網
上載者:User

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

1.意圖
保證一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。
熱門詞彙:單例 唯一 私人構造

2.結構

android中有很多系統層級的全域變數,如時間,IME,賬戶,狀態列等等,android中對這些都直接或者有些間接用到了單例模式。
以IME為例,把修改為實際情況:


非常的簡單,但是有一點,從上面我們也看到了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)) {            //擷取IME管理者唯一執行個體            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).對唯一執行個體的受控訪問。
(3).避免全域變數汙染命名空間。
(4).允許對操作和表示的精化。
(5).比類操作更靈活。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.