編輯:關於Android編程
單例模式,可以說是GOF的23種設計模式中最簡單的一個。
這個模式相對於其他幾個模式比較獨立,它只負責控制自己的實例化數量單一(而不是考慮為用戶產生什麼樣的實例),很有意思,是一個感覺上很干淨的模式,本人很喜歡這個模式。
android中很多地方都用到了單例模式,本文以輸入法管理者InputMethodManager為例,展開分析。
單例模式,Singleton Pattern,能夠以其特有的優勢,替代系統中全局變量,應用非常廣泛。
1.意圖
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
熱門詞匯:單例 唯一 私有構造
2.結構
android中有很多系統級別的全局變量,如時間,輸入法,賬戶,狀態欄等等,android中對這些都直接或者有些間接用到了單例模式。
以輸入法為例,把上圖修改為實際情況:
非常的簡單,但是有一點,從上面我們也看到了synchronized關鍵字,在多線程的環境下,單例模式為了保證自己實例數量的唯一,必然會做並發控制。
類似這種線程安全的單例,跨進程的單例,參數化的單例等等的情況,確實超出本文的范圍,而且都涉及到很多東西,是一個很大的話題,不好展開。
3. 代碼:
publicfinalclassInputMethodManager{
staticfinalObjectmInstanceSync=newObject();//同步
//內部全局唯一實例
staticInputMethodManagermInstance;
//對外api
staticpublicInputMethodManagergetInstance(Contextcontext){
returngetInstance(context.getMainLooper());
}
/**
*內部api,供上面的外部api調用
*@hide系統隱藏的api
*/
staticpublicInputMethodManagergetInstance(LoopermainLooper){
synchronized(mInstanceSync){
if(mInstance!=null){
returnmInstance;
}
IBinderb=ServiceManager.getService(Context.INPUT_METHOD_SERVICE);
IInputMethodManagerservice=IInputMethodManager.Stub.asInterface(b);
mInstance=newInputMethodManager(service,mainLooper);
}
returnmInstance;
}
}
客戶端調用,比如contextimpl中的getSystemService()方法中如下調用:
classContextImplextendsContext{
@Override
publicObjectgetSystemService(Stringname){
if(WINDOW_SERVICE.equals(name)){
//......省略下面n個if,elseif
}elseif(INPUT_METHOD_SERVICE.equals(name)){
//獲取輸入法管理者唯一實例
returnInputMethodManager.getInstance(this);
}elseif(KEYGUARD_SERVICE.equals(name)){
//......省略下面n個if,elseif
}elseif(ACCESSIBILITY_SERVICE.equals(name)){
//又見單例,無處不在
returnAccessibilityManager.getInstance(this);
}elseif(LOCATION_SERVICE.equals(name)){
//......省略下面n個if,elseif
}elseif(NFC_SERVICE.equals(name)){
returngetNfcManager();
}
returnnull;
}
}
非常簡單,干淨的一個模式。
4.效果
(1).創建型模式。
(2).對唯一實例的受控訪問。
(3).避免全局變量污染命名空間。
(4).允許對操作和表示的精化。
(5).比類操作更靈活。
最近在最後的任職期還被搾了一頓忙的飛起,不過今天是最後一天了,幫著處理個BUG就功德圓滿了。然後最近在做一個手機間通信+XX監聽的Demo,其中一部分是關於短信監聽的,然
美顏包含磨皮、美白、瘦臉等效果,其中磨皮算法在很多博客中均有介紹例如:雙指數邊緣平滑濾波器用於磨皮算法的嘗試選擇性模糊及其算法的實現基於局部均方差相關信息的圖像去噪及其在
在國內屏蔽了許多外國網站,連google 和android都屏蔽了,做程序員的就苦了!不過車到山前必有路,我們也有我們的辦法!首先要先進去google等的一系列網站,那麼
BatteryStatsService主要負責電池電量的統計信息,首先我們簡單的看下電量統計服務的啟動過程。 BatteryStatsService啟動過程&n