自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android設(shè)計(jì)模式系列-單例模式

移動(dòng)開發(fā) Android
這個(gè)模式相對于其他幾個(gè)模式比較獨(dú)立,它只負(fù)責(zé)控制自己的實(shí)例化數(shù)量單一(而不是考慮為用戶產(chǎn)生什么樣的實(shí)例),很有意思,是一個(gè)感覺上很干凈的模式,本人很喜歡這個(gè)模式。

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

 

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

 

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

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

android中有很多系統(tǒng)級別的全局變量,如時(shí)間,輸入法,賬戶,狀態(tài)欄等等,android中對這些都直接或者有些間接用到了單例模式。
以輸入法為例,把上圖修改為實(shí)際情況:


非常的簡單,但是有一點(diǎn),從上面我們也看到了synchronized關(guān)鍵字,在多線程的環(huán)境下,單例模式為了保證自己實(shí)例數(shù)量的***,必然會做并發(fā)控制。
類似這種線程安全的單例,跨進(jìn)程的單例,參數(shù)化的單例等等的情況,確實(shí)超出本文的范圍,而且都涉及到很多東西,是一個(gè)很大的話題,不好展開。

3. 代碼:

  1. public final class InputMethodManager {  
  2.     static final Object mInstanceSync = new Object();//同步  
  3.     //內(nèi)部全局***實(shí)例  
  4.     static InputMethodManager mInstance;  
  5.    
  6.     //對外api  
  7.     static public InputMethodManager getInstance(Context context) {  
  8.         return getInstance(context.getMainLooper());  
  9.     }  
  10.        
  11.     /**  
  12.      * 內(nèi)部api,供上面的外部api調(diào)用  
  13.      * @hide 系統(tǒng)隱藏的api  
  14.      */ 
  15.     static public InputMethodManager getInstance(Looper mainLooper) {  
  16.         synchronized (mInstanceSync) {  
  17.             if (mInstance != null) {  
  18.                 return mInstance;  
  19.             }  
  20.             IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);  
  21.             IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);  
  22.             mInstance = new InputMethodManager(service, mainLooper);  
  23.         }  
  24.         return mInstance;  
  25.     }  
  26. }  

客戶端調(diào)用,比如contextimpl中的getSystemService()方法中如下調(diào)用:

  1. class ContextImpl extends Context{  
  2.     @Override  
  3.     public Object getSystemService(String name) {  
  4.         if (WINDOW_SERVICE.equals(name)) {  
  5.             //... ... 省略下面n個(gè)if,else if  
  6.         } else if (INPUT_METHOD_SERVICE.equals(name)) {  
  7.             //獲取輸入法管理者***實(shí)例  
  8.             return InputMethodManager.getInstance(this);  
  9.         }  else if (KEYGUARD_SERVICE.equals(name)) {  
  10.              //... ... 省略下面n個(gè)if,else if  
  11.         } else if (ACCESSIBILITY_SERVICE.equals(name)) {  
  12.             //又見單例,無處不在  
  13.             return AccessibilityManager.getInstance(this);  
  14.         } else if (LOCATION_SERVICE.equals(name)) {  
  15.             //... ... 省略下面n個(gè)if,else if  
  16.         }  else if (NFC_SERVICE.equals(name)) {  
  17.             return getNfcManager();  
  18.         }  
  19.         return null;  
  20.     }  
  21. }  

非常簡單,干凈的一個(gè)模式。

4.效果
(1).創(chuàng)建型模式。
(2).對***實(shí)例的受控訪問。
(3).避免全局變量污染命名空間。
(4).允許對操作和表示的精化。
(5).比類操作更靈活。

責(zé)任編輯:張葉青 來源: 博客園
相關(guān)推薦

2021-03-02 08:50:31

設(shè)計(jì)單例模式

2022-02-06 22:30:36

前端設(shè)計(jì)模式

2016-03-28 10:23:11

Android設(shè)計(jì)單例

2021-02-01 10:01:58

設(shè)計(jì)模式 Java單例模式

2022-06-07 08:55:04

Golang單例模式語言

2024-02-04 12:04:17

2015-09-06 11:07:52

C++設(shè)計(jì)模式單例模式

2013-11-26 15:48:53

Android設(shè)計(jì)模式SDK

2015-01-14 13:26:58

AndroidJava單例

2021-08-11 17:22:11

設(shè)計(jì)模式單例

2013-11-26 17:00:08

Android設(shè)計(jì)模式

2013-11-26 17:15:13

Android設(shè)計(jì)模式

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2013-11-26 16:29:22

Android設(shè)計(jì)模式

2013-11-26 16:39:21

Android設(shè)計(jì)模式

2022-09-29 08:39:37

架構(gòu)

2022-01-12 13:33:25

工廠模式設(shè)計(jì)

2020-10-23 09:40:26

設(shè)計(jì)模式

2020-11-03 13:05:18

命令模式

2020-11-04 08:54:54

狀態(tài)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號