編輯:關於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.效果
創建型模式。
對唯一實例的受控訪問。
避免全局變量污染命名空間。
允許對操作和表示的精化。
比類操作更靈活。
美團Android資源混淆保護實踐 前言 Android應用中的APK安全性一直遭人诟病,市面上充斥著各種被破解或者漢化的應用,破解者可以非常簡單的通過破解工具就能對一個
Android ExpandableListView的技巧和問題,expandablelistview前言: 最近一個多月在認真的學習Android和做項目,文章內容表達
Android pull解析xml文件,androidpull解析xml本文介紹android中使用pull來解析xml文件 先自己寫一個xml文件,存一些天氣信息 &
Android事件分發機制淺談(一),android淺談---恢復內容開始--- 一、是什麼 我們首先要了解