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

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

以輸入法為例,把上圖修改為實(shí)際情況:
非常的簡(jiǎn)單,但是有一點(diǎn),從上面我們也看到了synchronized關(guān)鍵字,在多線程的環(huán)境下,單例模式為了保證自己實(shí)例數(shù)量的唯一,必然會(huì)做并發(fā)控制。
類似這種線程安全的單例,跨進(jìn)程的單例,參數(shù)化的單例等等的情況,確實(shí)超出本文的范圍,而且都涉及到很多東西,是一個(gè)很大的話題,不好展開(kāi)。
3. 代碼:
public final class InputMethodManager {
static final Object mInstanceSync = new Object();//同步
//內(nèi)部全局唯一實(shí)例
static InputMethodManager mInstance;
//對(duì)外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個(gè)if,else if
} else if (INPUT_METHOD_SERVICE.equals(name)) {
//獲取輸入法管理者唯一實(shí)例
return InputMethodManager.getInstance(this);
} else if (KEYGUARD_SERVICE.equals(name)) {
//... ... 省略下面n個(gè)if,else if
} else if (ACCESSIBILITY_SERVICE.equals(name)) {
//又見(jiàn)單例,無(wú)處不在
return AccessibilityManager.getInstance(this);
} else if (LOCATION_SERVICE.equals(name)) {
//... ... 省略下面n個(gè)if,else if
} else if (NFC_SERVICE.equals(name)) {
return getNfcManager();
}
return null;
}
}
非常簡(jiǎn)單,干凈的一個(gè)模式。
4.效果
(1).創(chuàng)建型模式。
(2).對(duì)唯一實(shí)例的受控訪問(wèn)。
(3).避免全局變量污染命名空間。
(4).允許對(duì)操作和表示的精化。
(5).比類操作更靈活。
以上所述是小編給大家介紹的Android設(shè)計(jì)模式系列之單例模式,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android ViewPager循環(huán)播放廣告實(shí)例詳解
這篇文章主要介紹了Android ViewPager循環(huán)播放廣告條實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android CardView+ViewPager實(shí)現(xiàn)ViewPager翻頁(yè)動(dòng)畫(huà)的方法
本篇文章主要介紹了Android CardView+ViewPager實(shí)現(xiàn)ViewPager翻頁(yè)動(dòng)畫(huà)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
android實(shí)現(xiàn)切換日期左右無(wú)限滑動(dòng)效果
本篇內(nèi)容給大家分享了android開(kāi)發(fā)時(shí)候?qū)崿F(xiàn)自定義的日期無(wú)限左右滑動(dòng)效果以及控件使用的技巧。2017-11-11
Android view更改背景資源與padding消失的問(wèn)題解決辦法
這篇文章主要介紹了Android view更改背景資源與padding消失的問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android開(kāi)發(fā)中關(guān)于獲取當(dāng)前Activity的一些思考
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)過(guò)程中,關(guān)于獲取當(dāng)前Activity的一些思考,感興趣的小伙伴們可以參考一下2016-02-02
Android編程檢測(cè)手機(jī)錄音權(quán)限是否打開(kāi)的方法
這篇文章主要介紹了Android編程檢測(cè)手機(jī)錄音權(quán)限是否打開(kāi)的方法,涉及Android針對(duì)音頻操作的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2017-11-11
Android鬧鈴服務(wù)AlarmManager用法深入分析
這篇文章主要介紹了Android鬧鈴服務(wù)AlarmManager用法,結(jié)合實(shí)例形式深入分析了鬧鈴服務(wù)AlarmManager的功能、原理、定義與使用方法,需要的朋友可以參考下2016-08-08
Android 微信6.1 tab欄圖標(biāo)和字體顏色漸變的實(shí)現(xiàn)
本文主要對(duì)微信6.1 tab 欄顏色漸變效果的實(shí)現(xiàn)全過(guò)程進(jìn)行分析介紹,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2016-12-12
android實(shí)現(xiàn)截圖并動(dòng)畫(huà)消失效果的思路詳解
這篇文章主要介紹了android實(shí)現(xiàn)截圖并動(dòng)畫(huà)消失的思路詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

