日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

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

來源:程序員人生   發布時間:2016-11-14 10:14:15 閱讀次數:2876次

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 热久久久 | 亚洲一区av在线 | 久久久久人 | 国产精品午夜在线 | 精品视频在线免费 | 色淫视频| 美女h网站| 久久久夜精品 | 久久精品国产免费 | 日韩影视精品 | 欧美胖老太一级毛片 | www.91.com在线观看 | 国产精品久久国产精品 | 网站黄色一级片 | 日韩网站免费观看 | 久久精品免费播放 | 久久精品国产一区二区三区不卡 | 簧片在线免费观看 | 国产成人精品一区二区三区 | 久久久国产一区 | 毛片基地黄久久久久久天堂 | 欧美男男videos| 国产精品1区| 精品一区亚洲 | 天天摸天天操天天干 | 中文字幕二区 | 欧美 日韩 国产在线 | 黄色一级片在线免费观看 | 99免费精品| 久久久.com | 国产嫩草影院 | 欧美亚洲成人网 | 最新版天堂中文在线官网 | 国产传媒一区二区三区 | 亚洲高清在线观看 | 91午夜精品 | 日韩一区二区精品 | 欧美一区二区三区在线播放 | 一区二区三区四区国产精品 | 男女黄色网 | 成人h动漫精品一区二区器材 |