Android開發中無處不在的設計模式 單例模式

2021-07-10 05:25:05 字數 2700 閱讀 6321

對於開發人員來說,設計模式有時候就是一道坎,但是設計模式又非常有用,過了這道坎,它可以讓你水平提高乙個檔次。而在android開發中,必要的了解一些設計模式又是非常有必要的。對於想系統的學習設計模式的同學,這裡推薦2本書。一本是head first系列的head hirst design pattern,英文好的可以看英文,可以多讀幾遍。另外一本是大話設計模式。

這篇文章介紹乙個模式,就是單例模式,因為個人覺得這個模式理解起來最容易,而且不是太複雜。

首先了解一些什麼是單例,從名字中就可以聽出來就是在記憶體中維護唯一物件。這樣做有以下幾個優點

其實單例有很多種實現方式,但是個人比較傾向於其中1種。可以見單例模式

**如下

public

class singleton

public

static singleton getinstance() }}

return instance;

}}

要保證單例,需要做一下幾步

至於單例的併發測試,可以使用countdownlatch,使用await()等待鎖釋放,使用countdown()釋放鎖從而達到併發的效果。可以見下面的**

public

static

void

main(string args) catch (interruptedexception e)

system.out.println(singleton.getinstance().hashcode());

}}.start();

}latch.countdown();

}

看看列印出來的hashcode會不會出現不一樣即可,理論上是全部都一樣的。

而在android中,很多地方用到了單例。

比如android-universal-image-loader中的單例

private

volatile

static imageloader instance;

/** returns singleton class instance */

public

static imageloader getinstance() }}

return instance;

}

比如eventbus中的單例

private

static

volatile eventbus defaultinstance;

public

static eventbus getdefault() }}

return defaultinstance;

}

上面的單例都是比較規規矩矩的,當然實際上有很多單例都是變了乙個樣子,單本質還是單例。

如inputmethodmanager 中的單例

static inputmethodmanager sinstance;

public

static inputmethodmanager getinstance()

return sinstance;

}}

accessibilitymanager 中的單例,看**這麼長,其實就是進行了一些判斷,還是乙個單例

private

static accessibilitymanager sinstance;

public

static accessibilitymanager getinstance(context context) else

ibinder ibinder = servicemanager.getservice(context.accessibility_service);

iaccessibilitymanager service = iaccessibilitymanager.stub.asinte***ce(ibinder);

sinstance = new accessibilitymanager(context, service, userid);}}

return sinstance;

}

當然單例還有很多種寫法,比如惡漢式,有興趣的自己去了解就好了。

最後,我們應用一下單例模式。典型的乙個應用就是管理我們的activity,下面這個可以作為乙個工具類,**也很簡單,也不做什麼解釋了。

public

class activitymanager

public

static activitymanager getinstance()

}return instance;

}public

void

addacticity(activity act)

public

void

removeactivity(activity act)

public

void

killmyprocess()

mactivitystack.clear();

android.os.process.killprocess(android.os.process.mypid());

}}

這個類可以在開源中國的幾個客戶端中找到類似的原始碼

以上兩個類是一樣的,沒區別。

系統無處不在

本書最大的啟示 西方的科學通常是一種不斷的從大到小範圍內進行不停的劃分,當把問題劃分到足夠小的時候就可以解決。但是本書是一種逆向的方式,以整體化和系統化的方式看待問題,尤其是將問題還原到系統中的觀點極其的獨特,有非常高的借鑑意義。系統化思維在自然和社會的方方面面都在發揮著重要的作用。我們在看待某個問...

數學無處不在

數學無處不在 基本資訊 叢書名 數學與人文 出版社 高等教育出版社 isbn 9787040345346 出版日期 2012 年5月 開本 16開 頁碼 1 版次 1 1 所屬分類 數學 更多關於 數學無處不在 內容簡介 數學書籍 本著叢書 讓數學成為國人文化的一部分 的宗旨,我們在本輯向讀者展示 ...

Cache無處不在

本文屬於備忘錄形式的,記錄了最近的一些收穫。在web世界裡,cache是無所不在的。客戶端的瀏覽器會針對訪問的網頁自動的快取一部分的靜態檔案,從而增加瀏覽的速度,這就是我們為什麼會在瀏覽器的臨時資料夾中發現大量莫名其妙檔案的理由。另外isp為了增加使用者的訪問速度,也會在中轉的伺服器中提供大量的快取...