Android設計模式系列-單例模式
來源:程序員人生 發布時間:2016-11-14 10:14:15 閱讀次數:2861次
單例模式,可以說是GOF的23種設計模式中最簡單的1個。
這個模式相對其他幾個模式比較獨立,它只負責控制自己的實例化數量單1(而不是斟酌為用戶產生甚么樣的實例),很成心思,是1個感覺上很干凈的模式,本人很喜歡這個模式。
android中很多地方都用到了單例模式,本文以輸入法管理者InputMethodManager為例,展開分析。
單例模式,Singleton Pattern,能夠以其獨有的優勢,替換系統中全局變量,利用非常廣泛。
1.意圖
保證1個類唯一1個實例,并提供1個訪問它的全局訪問點。
熱門辭匯:單例 唯1 私有構造
2.結構
android中有很多系統級別的全局變量,如時間,輸入法,賬戶,狀態欄等等,android中對這些都直接或有些間接用到了單例模式。
以輸入法為例,把上圖修改成實際情況:

非常的簡單,但是有1點,從上面我們也看到了synchronized關鍵字,在多線程的環境下,單例模式為了保證自己實例數量的唯1,必定會做并發控制。
類似這類線程安全的單例,跨進程的單例,參數化的單例等等的情況,確切超越本文的范圍,而且都觸及到很多東西,是1個很大的話題,不好展開。
3. 代碼:
- public final class InputMethodManager {
- static final Object mInstanceSync = new Object();
-
- static InputMethodManager mInstance;
-
-
- static public InputMethodManager getInstance(Context context) {
- return getInstance(context.getMainLooper());
- }
-
-
-
-
-
- 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)) {
-
- } else if (INPUT_METHOD_SERVICE.equals(name)) {
-
- return InputMethodManager.getInstance(this);
- } else if (KEYGUARD_SERVICE.equals(name)) {
-
- } else if (ACCESSIBILITY_SERVICE.equals(name)) {
-
- return AccessibilityManager.getInstance(this);
- } else if (LOCATION_SERVICE.equals(name)) {
-
- } else if (NFC_SERVICE.equals(name)) {
- return getNfcManager();
- }
- return null;
- }
- }
非常簡單,干凈的1個模式。
4.效果
(1).創建型模式。
(2).對唯1實例的受控訪問。
(3).避免全局變量污染命名空間。
(4).允許對操作和表示的精化。
(5).比類操作更靈活。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈