欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android設(shè)計(jì)模式之單例模式解析

 更新時(shí)間:2017年10月10日 11:00:02   作者:xxq2dream  
這篇文章主要為大家詳細(xì)介紹了Android設(shè)計(jì)模式之單例模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在日常開發(fā)過程中時(shí)常需要用到設(shè)計(jì)模式,但是設(shè)計(jì)模式有23種,如何將這些設(shè)計(jì)模式了然于胸并且能在實(shí)際開發(fā)過程中應(yīng)用得得心應(yīng)手呢?和我一起跟著《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》一書邊學(xué)邊應(yīng)用吧!

今天我們要講的是單例模式

定義

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

使用場(chǎng)景

確保某個(gè)類有且只有一個(gè)對(duì)象的場(chǎng)景,避免產(chǎn)生多個(gè)對(duì)象消耗過多的資源
某個(gè)類型的對(duì)象只應(yīng)該有一個(gè)

使用例子

  • 應(yīng)用的Application
  • 圖片加載框架對(duì)象,比如我們的ImageLoader,常用的圖片加載框架Glide,universal-image-loader等
  • 數(shù)據(jù)請(qǐng)求管理類,比如可以用一個(gè)類來統(tǒng)一所有的數(shù)據(jù)請(qǐng)求處理,訪問數(shù)據(jù)庫(kù),網(wǎng)絡(luò)請(qǐng)求等,這樣的類肯定只需要一個(gè)實(shí)例

實(shí)現(xiàn)

實(shí)現(xiàn)的要點(diǎn)

  • 構(gòu)造函數(shù)不對(duì)外開放,必須為Private(就是不能用New的形式生成對(duì)象)
  • 通過一個(gè)靜態(tài)方法或者枚舉返回單例對(duì)象
  • 確保單例類的對(duì)象有且只有一個(gè),尤其是在多線程環(huán)境下
  • 確保單例類對(duì)象在反序列化時(shí)不會(huì)重新創(chuàng)建對(duì)象

常見的實(shí)現(xiàn)方式

餓漢單例模式

public class Singleton {
  private static final Singleton singleton = new Singleton();
  //構(gòu)造函數(shù)私有化
  private Singleton() {
  }
  //公有的靜態(tài)函數(shù),對(duì)外暴露獲取單例對(duì)象的接口
  public static Singleton getInstance() {
    return singleton;
  }
}

餓漢單例模式采用的是靜態(tài)變量 + fianl關(guān)鍵字的方式來確保單例模式,應(yīng)用啟動(dòng)的時(shí)候就生成單例對(duì)象,效率不高
懶漢模式

public class Singleton {
  private static Singleton singleton;
  //構(gòu)造函數(shù)私有化
  private Singleton() {
  }
  //公有的靜態(tài)函數(shù),對(duì)外暴露獲取單例對(duì)象的接口
  public static synchronized Singleton getInstance() {
    if (singleton == null) {
      singleton = new Singleton();
    }
    return singleton;
  }
}

懶漢模式的主要問題在于由于加了synchronized關(guān)鍵字,每調(diào)用一次getInstance方法,都會(huì)進(jìn)行同步,造成了不必要的開銷

以上的2種模式用的都不多,了解一下就好,下面介紹平時(shí)用得比較多的單例模式
Double Check Lock(DCL)模式(雙重檢查鎖定模式)

public class Singleton {
  private static Singleton singleton = null;
  //構(gòu)造函數(shù)私有化
  private Singleton() {
  }
  //公有的靜態(tài)函數(shù),對(duì)外暴露獲取單例對(duì)象的接口
  public static Singleton getInstance() {
    if (singleton == null) {
      synchronized (Singleton.class) {
        if (singleton == null) {
          singleton = new Singleton();
        }
      }
    }
    return singleton;
  }
}

DCL模式是使用最多的單例模式,它不僅能保證線程安全,資源利用率高,第一次執(zhí)行g(shù)etInstance時(shí)單例對(duì)象才會(huì)實(shí)例化;同時(shí),后續(xù)調(diào)用getInstance方法時(shí)又不會(huì)有懶漢模式的重復(fù)同步的問題,效率更高;在絕大多數(shù)情況下都能保證單例對(duì)象的唯一性

DCL模式的缺點(diǎn)是第一次加載時(shí)由于需要同步反應(yīng)會(huì)稍慢;在低于JDK1.5的版本里由于Java內(nèi)存模型的原因有可能會(huì)失效
靜態(tài)內(nèi)部類單例模式

public class Singleton {
  private Singleton() {
  }

  public static Singleton getInstance() {
    return SingletonHolder.sInstance;
  }

  //靜態(tài)內(nèi)部類
  private static class SingletonHolder {
    private static final Singleton sInstance = new Singleton();
  }
}

第一次加載Singleton類時(shí)不會(huì)初始化sInstance,只有在第一次調(diào)用getInstance方法時(shí)才會(huì)初始化sInstance,延遲了單例對(duì)象的實(shí)例化

靜態(tài)內(nèi)部類單例模式不僅能保證線程安全也能保證單例對(duì)象的唯一性

靜態(tài)內(nèi)部類單例模式和DCL模式是推薦的單例實(shí)現(xiàn)模式

枚舉單例

public enum Singleton {
  INSTANCE;
}

默認(rèn)枚舉實(shí)例的創(chuàng)建是線程安全的,并且在任何情況下它都是一個(gè)單例
其他的單例模式,在一種情況下會(huì)出現(xiàn)失效的情況——反序列化,但是枚舉即使在反序列化情況下也不會(huì)失效

總結(jié)

單例模式是運(yùn)用頻率很高的模式,由于在客戶端一般沒有高并發(fā)的情況,現(xiàn)在的JDK版本也已經(jīng)到了9了,一般推薦用DCL模式和靜態(tài)內(nèi)部類2種實(shí)現(xiàn)。

單例對(duì)象的生命周期很長(zhǎng),如果持有Context,很容易引發(fā)內(nèi)存泄漏,所以傳遞給單例對(duì)象的Context最好是Application Context

最后加點(diǎn)福利

單例模式的代碼格式都是固定的,每次都要那么寫有點(diǎn)麻煩,咱們可以用添加模板的方法來偷懶,詳情見圖。

添加了模板后,在需要實(shí)現(xiàn)單例模式的類里面直接輸入你的模板名字,如圖中的sin, Android Studio就會(huì)出現(xiàn)提示,回車搞定!趕緊試試吧!

源碼地址:https://github.com/snowdream1314/ImageLoader

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android中activity從創(chuàng)建到顯示的基本介紹

    Android中activity從創(chuàng)建到顯示的基本介紹

    這篇文章主要給大家介紹了關(guān)于Android中activity從創(chuàng)建到顯示的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android初學(xué)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。
    2017-11-11
  • Android EditText 監(jiān)聽用戶輸入完成的實(shí)例

    Android EditText 監(jiān)聽用戶輸入完成的實(shí)例

    下面小編就為大家分享一篇Android EditText 監(jiān)聽用戶輸入完成的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • A10_DatePicker的對(duì)話框設(shè)置(使用OnDateSetListener監(jiān)聽器)

    A10_DatePicker的對(duì)話框設(shè)置(使用OnDateSetListener監(jiān)聽器)

    本文主要彌補(bǔ)A07_TimePicker & DatePicker & AnalogClock & DigitalClock 的設(shè)置,具體實(shí)現(xiàn)代碼如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android開發(fā)重寫Animation實(shí)現(xiàn)下拉圖片后彈射回去效果示例

    Android開發(fā)重寫Animation實(shí)現(xiàn)下拉圖片后彈射回去效果示例

    這篇文章主要介紹了Android開發(fā)重寫Animation實(shí)現(xiàn)下拉圖片后彈射回去效果,結(jié)合實(shí)例形式分析了Android自定義類繼承Animation實(shí)現(xiàn)圖片彈射效果的相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android?Kotlin?中的groupBy方法詳解

    Android?Kotlin?中的groupBy方法詳解

    在Kotlin中,groupBy函數(shù)可以對(duì)集合進(jìn)行分組,形成一個(gè)Map,其中key是分組標(biāo)準(zhǔn),value是對(duì)應(yīng)的元素列表,本文通過實(shí)例詳細(xì)解釋groupBy的使用方法和常見應(yīng)用場(chǎng)景,如按員工年齡分組或產(chǎn)品類型統(tǒng)計(jì)數(shù)量等,展示了groupBy的靈活性和實(shí)用性
    2024-09-09
  • Android canvas drawBitmap方法詳解及實(shí)例

    Android canvas drawBitmap方法詳解及實(shí)例

    這篇文章主要介紹了 Android canvas drawBitmap方法詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    這篇文章主要給大家介紹了關(guān)于Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面來一起看看吧。
    2017-05-05
  • Android自定義View實(shí)現(xiàn)多邊形統(tǒng)計(jì)圖示例代碼

    Android自定義View實(shí)現(xiàn)多邊形統(tǒng)計(jì)圖示例代碼

    這篇文章主要給大家介紹了關(guān)于Android自定義View如何實(shí)現(xiàn)多邊形統(tǒng)計(jì)圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • android繪制多個(gè)黑豎線條

    android繪制多個(gè)黑豎線條

    這篇文章主要為大家詳細(xì)介紹了android繪制多個(gè)黑豎線條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android實(shí)現(xiàn)清除單個(gè)域名的cookie

    Android實(shí)現(xiàn)清除單個(gè)域名的cookie

    這篇文章主要介紹了Android實(shí)現(xiàn)清除單個(gè)域名的cookie,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03

最新評(píng)論