多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android設計模式系列-單例模式

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. 代碼:

  1. public final class InputMethodManager {  
  2.     static final Object mInstanceSync = new Object();//同步  
  3.     //內部全局唯1實例  
  4.     static InputMethodManager mInstance;  
  5.    
  6.     //對外api  
  7.     static public InputMethodManager getInstance(Context context) {  
  8.         return getInstance(context.getMainLooper());  
  9.     }  
  10.        
  11.     /**  
  12.      * 內部api,供上面的外部api調用  
  13.      * @hide 系統隱藏的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. }  

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

  1. class ContextImpl extends Context{  
  2.     @Override  
  3.     public Object getSystemService(String name) {  
  4.         if (WINDOW_SERVICE.equals(name)) {  
  5.             //... ... 省略下面n個if,else if  
  6.         } else if (INPUT_METHOD_SERVICE.equals(name)) {  
  7.             //獲得輸入法管理者唯1實例  
  8.             return InputMethodManager.getInstance(this);  
  9.         }  else if (KEYGUARD_SERVICE.equals(name)) {  
  10.              //... ... 省略下面n個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個if,else if  
  16.         }  else if (NFC_SERVICE.equals(name)) {  
  17.             return getNfcManager();  
  18.         }  
  19.         return null;  
  20.     }  
  21. }  

非常簡單,干凈的1個模式。

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲免费在线观看视频 | 中文字幕第二十页 | 亚洲欧美国产毛片在线 | 日韩视频高清免费看 | 久久99国产精品成人 | 亚洲成a人片在线观看中文!!! | 久久国产精品一区 | 午夜免费福利片观看 | 一级做a爰片性色毛片刺激 一级做a爰片性色毛片黄书 | 国产精品21区 | 国产免费一区二区三区最新 | 16欧美freesex呦交hd | 中文字幕乱码中文乱码51精品 | 欧美一级欧美三级在线观看 | 国内视频精品 | 一级黄色欧美 | 不卡视频一区二区三区 | 欧美一级欧美一级毛片 | xxxxxx日本 | 日本护士xxxxx18.19| 视频精品一区 | 最新日本一级中文字幕 | 久久精品国产亚洲精品 | 尤物视频在线观看网站 | 亚洲成人毛片 | 日本自己的私人影院 | 午夜视频在线免费播放 | 最近最新中文字幕免费的一页 | 亚洲最大黄色 | 欧美xxxx做受欧美人妖 | 欧美精品一区二区三区久久 | 亚洲综合久久久 | 手机福利在线观看 | xxxx18野外xxxxfreexxxx日本 | 最近最新中文字幕大全手机在线 | 在线免费观看福利 | 国产人成精品免费视频 | 日本一区二区三区免费高清在线 | 久久久亚洲欧美综合 | 欧美不卡一区二区三区免 | 亚洲人成在线影院 |