Android——單例模式


詳細的各種模式

http://mobile.51cto.com/android-419145.htm

http://wenku.baidu.com/link?url=f3yjQ6YvslvHcWJLbyKTbu3D2K-gESwOhW7HQnVV6RJIEuhZz-Gw5P8kFRw2wo3T1PicDsuKn2AgRiy99TUcxIJdjx8yp4lf6Gf5W2sHFeu

http://baike.baidu.com/link?url=oAR1a4M5t3vjl2ktev8cuOAOKnZwRNczmRX6ot6e8iHTpqRrwAOcpSQmF5ILnAqJEMKrV_ojIt7je0jVMgXkc_

單例模式:

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).對唯一實例的受控訪問。
(3).避免全局變量污染命名空間。
(4).允許對操作和表示的精化。
(5).比類操作更靈活。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM