国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android設計模式之單例模式解析

2019-10-22 18:26:11
字體:
來源:轉載
供稿:網友

在日常開發過程中時常需要用到設計模式,但是設計模式有23種,如何將這些設計模式了然于胸并且能在實際開發過程中應用得得心應手呢?和我一起跟著《Android源碼設計模式解析與實戰》一書邊學邊應用吧!

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

定義

確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例

使用場景

確保某個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源
某個類型的對象只應該有一個

使用例子

  • 應用的Application
  • 圖片加載框架對象,比如我們的ImageLoader,常用的圖片加載框架Glide,universal-image-loader等
  • 數據請求管理類,比如可以用一個類來統一所有的數據請求處理,訪問數據庫,網絡請求等,這樣的類肯定只需要一個實例

實現

實現的要點

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

常見的實現方式

餓漢單例模式

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

餓漢單例模式采用的是靜態變量 + fianl關鍵字的方式來確保單例模式,應用啟動的時候就生成單例對象,效率不高
懶漢模式

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

懶漢模式的主要問題在于由于加了synchronized關鍵字,每調用一次getInstance方法,都會進行同步,造成了不必要的開銷

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

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

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

DCL模式的缺點是第一次加載時由于需要同步反應會稍慢;在低于JDK1.5的版本里由于Java內存模型的原因有可能會失效
靜態內部類單例模式

public class Singleton {  private Singleton() {  }  public static Singleton getInstance() {    return SingletonHolder.sInstance;  }  //靜態內部類  private static class SingletonHolder {    private static final Singleton sInstance = new Singleton();  }}

第一次加載Singleton類時不會初始化sInstance,只有在第一次調用getInstance方法時才會初始化sInstance,延遲了單例對象的實例化

靜態內部類單例模式不僅能保證線程安全也能保證單例對象的唯一性

靜態內部類單例模式和DCL模式是推薦的單例實現模式

枚舉單例

public enum Singleton {  INSTANCE;}

默認枚舉實例的創建是線程安全的,并且在任何情況下它都是一個單例
其他的單例模式,在一種情況下會出現失效的情況——反序列化,但是枚舉即使在反序列化情況下也不會失效

總結

單例模式是運用頻率很高的模式,由于在客戶端一般沒有高并發的情況,現在的JDK版本也已經到了9了,一般推薦用DCL模式和靜態內部類2種實現。

單例對象的生命周期很長,如果持有Context,很容易引發內存泄漏,所以傳遞給單例對象的Context最好是Application Context

最后加點福利

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

Android,單例模式

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽源市| 平度市| 子长县| 连南| 奉新县| 富锦市| 凤城市| 西青区| 余江县| 米易县| 泊头市| 奉贤区| 蓬安县| 鹤庆县| 上蔡县| 伊金霍洛旗| 福安市| 凌海市| 漳州市| 保定市| 什邡市| 云龙县| 清苑县| 枞阳县| 丹寨县| 南开区| 长垣县| 武功县| 聂拉木县| 高碑店市| 昌平区| 临桂县| 建阳市| 玛纳斯县| 霍城县| 高安市| 灌南县| 成都市| 特克斯县| 化隆| 卓尼县|