Android設(shè)計模式系列之單例模式
單例模式,可以說是GOF的23種設(shè)計模式中最簡單的一個。
這個模式相對于其他幾個模式比較獨立,它只負(fù)責(zé)控制自己的實例化數(shù)量單一(而不是考慮為用戶產(chǎn)生什么樣的實例),很有意思,是一個感覺上很干凈的模式,本人很喜歡這個模式。
android中很多地方都用到了單例模式,本文以輸入法管理者InputMethodManager為例,展開分析。
單例模式,Singleton Pattern,能夠以其特有的優(yōu)勢,替代系統(tǒng)中全局變量,應(yīng)用非常廣泛。
1.意圖
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
熱門詞匯:單例 唯一 私有構(gòu)造
2.結(jié)構(gòu)

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

以輸入法為例,把上圖修改為實際情況:
非常的簡單,但是有一點,從上面我們也看到了synchronized關(guān)鍵字,在多線程的環(huán)境下,單例模式為了保證自己實例數(shù)量的唯一,必然會做并發(fā)控制。
類似這種線程安全的單例,跨進程的單例,參數(shù)化的單例等等的情況,確實超出本文的范圍,而且都涉及到很多東西,是一個很大的話題,不好展開。
3. 代碼:
public final class InputMethodManager {
static final Object mInstanceSync = new Object();//同步
//內(nèi)部全局唯一實例
static InputMethodManager mInstance;
//對外api
static public InputMethodManager getInstance(Context context) {
return getInstance(context.getMainLooper());
}
/**
* 內(nèi)部api,供上面的外部api調(diào)用
* @hide 系統(tǒng)隱藏的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;
}
}
客戶端調(diào)用,比如contextimpl中的getSystemService()方法中如下調(diào)用:
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).創(chuàng)建型模式。
(2).對唯一實例的受控訪問。
(3).避免全局變量污染命名空間。
(4).允許對操作和表示的精化。
(5).比類操作更靈活。
以上所述是小編給大家介紹的Android設(shè)計模式系列之單例模式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android SQLite數(shù)據(jù)庫增刪改查操作的使用詳解
本篇文章介紹了,在Android中SQLite數(shù)據(jù)庫增刪改查操作的使用詳解。需要的朋友參考下2013-04-04
Android使用第三方服務(wù)器Bmob實現(xiàn)發(fā)送短信驗證碼
這篇文章主要介紹了Android使用第三方服務(wù)器Bmob實現(xiàn)發(fā)送短信驗證碼的思路詳解,需要的朋友可以參考下2016-09-09
Android 監(jiān)聽網(wǎng)絡(luò)狀態(tài)方法詳解
這篇文章主要介紹了Android 監(jiān)聽網(wǎng)絡(luò)狀態(tài)方法詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07
GridView基于pulltorefresh實現(xiàn)下拉刷新 上拉加載更多功能(推薦)
原理和listview一樣 ,都是重寫Android原生控件。下面小編通過實例代碼給大家分享GridView基于pulltorefresh實現(xiàn)下拉刷新 上拉加載更多功能,非常不錯,一起看看吧2016-11-11
Diycode開源項目實例搭建上拉加載和下拉刷新的Fragment
這篇文章主要介紹了Diycode開源項目實例搭建上拉加載和下拉刷新的Fragment以及相關(guān)的代碼分享。2017-11-11
Android照片墻應(yīng)用實現(xiàn) 再多的圖片也不怕崩潰
這篇文章主要為大家詳細介紹了Android照片墻應(yīng)用實現(xiàn),再多的圖片也不怕崩潰,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Android實現(xiàn)外部喚起應(yīng)用跳轉(zhuǎn)指定頁面的方法
這篇文章主要給大家介紹了關(guān)于Android實現(xiàn)外部喚起應(yīng)用跳轉(zhuǎn)指定頁面的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12

