成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

單例模式,可以說是GOF的23種設計模式中最簡單的一個。

 

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

 

1.意圖
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
熱門詞匯:單例 *** 私有構造

2.結構

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


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

3. 代碼:

  1. public final class InputMethodManager {  
  2.     static final Object mInstanceSync = new Object();//同步  
  3.     //內部全局***實例  
  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.             //獲取輸入法管理者***實例  
  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. }  

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

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

責任編輯:張葉青 來源: 博客園
相關推薦

2021-03-02 08:50:31

設計單例模式

2022-02-06 22:30:36

前端設計模式

2016-03-28 10:23:11

Android設計單例

2021-02-01 10:01:58

設計模式 Java單例模式

2022-06-07 08:55:04

Golang單例模式語言

2015-09-06 11:07:52

C++設計模式單例模式

2024-02-04 12:04:17

2013-11-26 15:48:53

Android設計模式SDK

2015-01-14 13:26:58

AndroidJava單例

2013-11-26 17:00:08

Android設計模式

2013-11-26 17:15:13

Android設計模式

2021-08-11 17:22:11

設計模式單例

2022-09-29 08:39:37

架構

2013-11-26 16:29:22

Android設計模式

2013-11-26 16:39:21

Android設計模式

2013-11-26 17:09:57

Android設計模式

2020-11-04 08:54:54

狀態模式

2020-11-03 13:05:18

命令模式

2020-10-23 09:40:26

設計模式

2022-01-12 13:33:25

工廠模式設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美日韩在线播放 | 精品日韩一区二区三区 | 免费艹逼视频 | 欧美激情亚洲激情 | 亚洲成人播放器 | 91私密视频 | 欧美久久久电影 | 免费观看黄 | 久久不卡区 | 国产91在线播放 | 全免费a级毛片免费看视频免费下 | 99精品国产一区二区青青牛奶 | 久久综合一区 | 久久久毛片 | 成人在线观看网站 | 91久久久久久久 | 免费国产一区 | 韩国精品在线观看 | 国外成人在线视频网站 | 国产一区二区黑人欧美xxxx | 夜夜撸av | 亚洲精品一区二区在线观看 | 男人的天堂在线视频 | 三级黄色大片网站 | 高清人人天天夜夜曰狠狠狠狠 | 99综合| 天天看逼| 精品视频在线播放 | 黄色大片在线 | 国产麻豆乱码精品一区二区三区 | 欧美激情亚洲激情 | 中文字幕一页二页 | 99精品国产一区二区青青牛奶 | 国产欧美在线一区二区 | 欧美色欧美亚洲另类七区 | 成人免费一区二区三区视频网站 | 欧美一级α片 | 美女一区| 亚洲一区久久 | 国产成人高清成人av片在线看 | www.一区二区三区 |