android設(shè)計(jì)模式之單例模式

一、定義

確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并鄉(xiāng)整個(gè)系統(tǒng)提供這個(gè)實(shí)例。

二、使用場(chǎng)景

確保某個(gè)類有且只有一個(gè)對(duì)象的場(chǎng)景,避免產(chǎn)生多個(gè)對(duì)象消耗多個(gè)資源?;蛘吣承╊愓加锰嗟馁Y源,不適合創(chuàng)建多個(gè)對(duì)象的情況;例如:數(shù)據(jù)庫(kù)、IO訪問,
android中使用單例模式的類:ImageLoader

三、單例的類圖

單例模式
  • 角色介紹
  1. Client 客戶端類
  2. Singleton 單例類
  • 實(shí)現(xiàn)的關(guān)鍵點(diǎn)
  1. 構(gòu)造方法設(shè)置成為私有的private;
  2. 通過靜態(tài)方法或枚舉類型返回單例對(duì)象;
  3. 確保線程安全;

備注:?jiǎn)卫J降念?,有且只能有一個(gè)入口,注意盡量不要在單例模式中使用參數(shù),尤其是傳人類對(duì)象,會(huì)導(dǎo)致單例對(duì)象持有沒必要的引用,可能導(dǎo)致內(nèi)存泄漏。

四、代碼實(shí)例

1.餓漢模式

public class Person {

    private static final Person instance = new Person();

    private Person() {
    }

    public static Person getInstance() {
        return instance;
    }
}

最簡(jiǎn)單的單例模式,但是線程不安全。

2.懶漢模式

public class Person {
   private static Person instance;
    private Person() {}

    public static synchronized Person getInstance() {
        if (instance == null) {
            instance = new Person();
        }
        return instance;
    }
}

可以保證線程安全問題,但是每一次使用getInstance()方法都會(huì)進(jìn)行同步,而且第一次加載時(shí)需要進(jìn)行實(shí)例化,反應(yīng)稍慢;

3.Double Check Lock(DCL)實(shí)現(xiàn)單例模式

public class Person {
   private static volatile Person instance;
   private Person() {}

   public static Person getInstance(){
        if(instance == null){
            synchronized (Person.class){
                if(instance == null){
                    instance = new Person();
                }
            }
        }
        return instance;
    }
}

第一次判空是為了避免不必要的重復(fù),
第二次判空是為了在null情況下創(chuàng)建實(shí)例;
通過倆次檢測(cè)初始化對(duì)象實(shí)例,優(yōu)點(diǎn)是僅在需要的時(shí)候會(huì)創(chuàng)建實(shí)例,資源利用率高,缺點(diǎn)由于java的內(nèi)存模型的原因偶爾會(huì)失敗;推薦使用volatile關(guān)鍵字,將對(duì)像直接寫入主內(nèi)存,會(huì)影響性能,但是會(huì)保證程序的準(zhǔn)確性。

4.靜態(tài)內(nèi)部類實(shí)現(xiàn)單例模式

public class Person {
   private static volatile Person instance;
   private Person() {}
    
    public static Person getInstance(){
        return PersonHolder.instance;
    }
   //靜態(tài)內(nèi)部類
    private static class PersonHolder {
        private static final Person instance = new Person();
    }
}

優(yōu)點(diǎn):
1)第一次加載Person不會(huì)初始化;
2)第一次加載getInstance()導(dǎo)致虛擬機(jī)加載PersonHolder類,才會(huì)進(jìn)行類的初始化;
3)可以保證線程安全,以及單例的唯一性;
4)延遲了類的實(shí)例化,推薦使用該方法。

五、android源碼中的實(shí)現(xiàn)

  • 1.Context
  • 2.LayoutInflater
  • 3.PolicyManager
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡(jiǎn)單、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮?jiǎn)潔易懂,是項(xiàng)目中最...
    成熱了閱讀 4,532評(píng)論 4 34
  • 源碼地址說明: 此筆記是在看完 Android 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn) 中單例模式進(jìn)行的總結(jié)。 使用場(chǎng)景 確保某個(gè)...
    yangMr閱讀 526評(píng)論 0 2
  • 1 場(chǎng)景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個(gè)應(yīng)用,讀取配置文件的內(nèi)容。 很多應(yīng)用項(xiàng)目,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,967評(píng)論 12 68
  • 一.什么是單例 單例對(duì)象的類必須保證只有一個(gè)實(shí)例存在 對(duì)單例的實(shí)現(xiàn)可以分為兩大類——懶漢式和餓漢式,他們的區(qū)別在于...
    Android_Liu閱讀 2,134評(píng)論 0 6
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個(gè)類僅有一個(gè)...
    tandeneck閱讀 2,623評(píng)論 1 8

友情鏈接更多精彩內(nèi)容