Android設計模式系列之單例模式

Android設計模式系列之單例模式
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

 單例模式,可以說是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).比類操作更靈活。

以上所述是小編給大家介紹的Android設計模式系列之單例模式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對指令碼之家網站的支援!

您可能感興趣的文章:

android設計模式之單例模式詳解Android 單例模式 Singleton 簡單例項設計模式解析android開發設計模式之——單例模式詳解Android設計模式之單例模式解析Android設計模式之單例模式詳解Android設計模式之介面卡(Adapter)模式Android設計模式系列之組合模式Android設計模式系列之工廠方法模式Android設計模式之策略模式詳解Android程式設計設計模式之觀察者模式例項詳解Android程式設計設計模式之單例模式例項詳解

相關文章

Android 開發 最新文章