關(guān)于單例設(shè)計模式

1.單例對象的類必須保證只有一個實例存在,而且自行實例化并向整個系統(tǒng)提供這個實例

2.使用場景:確保某個類有且只有一個對象的常見,避免產(chǎn)生多個對象消耗過多的資源或者某種類型的對象只應該有且只有一個。

3.實現(xiàn)單例模式主要有如下幾個關(guān)鍵點:

①構(gòu)造函數(shù)不對外開放,一般為private

②通過一個靜態(tài)方法或者枚舉返回單例類對象

③確保單例類的對象有且只有一個,尤其是在多線程環(huán)境下

④確保單例類對象在反序列化時不會重新構(gòu)建對象

4.Android源碼中的單例模式

一個Activity的入口是ActivityThread的main函數(shù),在main函數(shù)中創(chuàng)建一個新的ActivityThread對象,并且啟動消息循環(huán)(UI線程),創(chuàng)建新的Activity,新的Context對象,然后將該Context對象傳遞給Activity。

深入理解LayoutInflater

LayoutInflater是一個抽象類

Activity的SetContentview方法實際上調(diào)用的是Window的SetContentView而Windows是一個抽象類,上文提到的Window的具體實現(xiàn)類是PhoneWindow。

Window的View層級圖:


mDecor中會加載一個系統(tǒng)定義好的布局,這個布局中有包裹了mContentParent,而這個mContentParent就是我們設(shè)置的布局,并將添加到Parent區(qū)域在PhoneWindow的SetContentView方法中也驗證了這點。首先會構(gòu)建mContentParent這個對象,然后通過LayoutInflater的inflate函數(shù)將指定布局的視圖添加到mContentParent中

inflate方法中,主要有下面幾步:

①解析xml中的跟標簽(第一個元素)

②如果根標簽是merge,那么調(diào)用rInflate進行解析,rInflate會將merge標簽下的所有子View直接添加到根標簽中

③如果標簽是普通元素,調(diào)用createViewFromTag對該元素進行解析

④調(diào)用rInflate解析temp根元素下的所有子View并且將這些View都添加到temp下

⑤返回解析到的根視圖

單例的優(yōu)缺點

優(yōu)點:

①由于單例模式在內(nèi)存中只有一個實例,減少內(nèi)存開支,特別是一個對象需要頻繁地創(chuàng)建,銷毀。而且創(chuàng)建或銷毀時性能又無法優(yōu)化,單例模式的優(yōu)勢非常明顯。

②由于單例模式只生成一個單例,所以,減少了系統(tǒng)的性能開銷,當一個對象的產(chǎn)生需要比較多的資源時,如讀取配置,產(chǎn)生其他依賴對象時,則可以通過在應用啟動時直接產(chǎn)生一個單例對象,然后用永久駐留內(nèi)存的方式來解決

③單例模式可以避免對資源的多重占用,例如一個寫文件操作,由于只有一個實例存在內(nèi)存中,避免對同一個資源文件的同時寫操作

④單例模式可以在系統(tǒng)設(shè)置全局的訪問點,優(yōu)化和共享資源訪問,例如,可以設(shè)計一個單例類,負責所有數(shù)據(jù)表的映射處理

缺點:

①單例模式一般沒有接口,擴展很困難,若要擴展,除了修改代碼基本沒有第二種途徑可以實現(xiàn)

②單例對象如果持有Context,那么很容易引發(fā)內(nèi)存泄露,此時需要注意傳遞給單例對象的Context最好是Application Context。


####歡迎關(guān)注公共號

![](https://upload-images.jianshu.io/upload_images/3258163-a5d26661ebcd43b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設(shè)計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,293評論 4 34
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • 單例模式介紹 許多時候整個系統(tǒng)只需要擁有一個全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。 使用場景: 如在一個應用...
    最最最最醉人閱讀 936評論 0 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,538評論 1 8