国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android設(shè)計模式系列之單例模式

2019-12-12 05:13:25
字體:
供稿:網(wǎng)友

 單例模式,可以說是GOF的23種設(shè)計模式中最簡單的一個。

這個模式相對于其他幾個模式比較獨(dú)立,它只負(fù)責(zé)控制自己的實(shí)例化數(shù)量單一(而不是考慮為用戶產(chǎn)生什么樣的實(shí)例),很有意思,是一個感覺上很干凈的模式,本人很喜歡這個模式。
android中很多地方都用到了單例模式,本文以輸入法管理者InputMethodManager為例,展開分析。
單例模式,Singleton Pattern,能夠以其特有的優(yōu)勢,替代系統(tǒng)中全局變量,應(yīng)用非常廣泛。

1.意圖

保證一個類僅有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)。
熱門詞匯:單例 唯一 私有構(gòu)造

2.結(jié)構(gòu)

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

以輸入法為例,把上圖修改為實(shí)際情況:

非常的簡單,但是有一點(diǎn),從上面我們也看到了synchronized關(guān)鍵字,在多線程的環(huán)境下,單例模式為了保證自己實(shí)例數(shù)量的唯一,必然會做并發(fā)控制。

類似這種線程安全的單例,跨進(jìn)程的單例,參數(shù)化的單例等等的情況,確實(shí)超出本文的范圍,而且都涉及到很多東西,是一個很大的話題,不好展開。

3. 代碼:

public final class InputMethodManager { static final Object mInstanceSync = new Object();//同步 //內(nèi)部全局唯一實(shí)例 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)) { //獲取輸入法管理者唯一實(shí)例 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).對唯一實(shí)例的受控訪問。

(3).避免全局變量污染命名空間。

(4).允許對操作和表示的精化。

(5).比類操作更靈活。

以上所述是小編給大家介紹的Android設(shè)計模式系列之單例模式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 保亭| 清徐县| 长葛市| 报价| 信阳市| 阳新县| 曲周县| 太康县| 怀集县| 岗巴县| 定安县| 九龙坡区| 农安县| 济南市| 焉耆| 普兰店市| 本溪| 固安县| 恩施市| 张家港市| 库伦旗| 葫芦岛市| 礼泉县| 得荣县| 辽源市| 满城县| 都昌县| 宜章县| 皋兰县| 乌兰县| 阆中市| 桐乡市| 读书| 成武县| 黔南| 句容市| 忻城县| 山阴县| 塔城市| 喀喇沁旗| 南昌市|