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

android開發(fā)設(shè)計模式之——單例模式詳解

 更新時間:2016年11月22日 15:37:20   作者:Beyond0525  
本篇文章主要介紹了android開發(fā)設(shè)計模式之——單例模式詳解,具有一定的參考價值,有需要的可以了解一下。

單例模式是設(shè)計模式中最常見也最簡單的一種設(shè)計模式,保證了在程序中只有一個實例存在并且能全局的訪問到。比如在Android實際APP 開發(fā)中用到的 賬號信息對象管理, 數(shù)據(jù)庫對象(SQLiteOpenHelper)等都會用到單例模式。下面針對一些例子分析一下我們在開發(fā)過程中應(yīng)用單例模式需要注意的點。

 一、作用

 單例模式(Singleton):保證一個類僅有一個實例,并提供一個訪問它的全局訪問點

二、適用場景

1. 應(yīng)用中某個實例對象需要頻繁的被訪問。

2. 應(yīng)用中每次啟動只會存在一個實例。如賬號系統(tǒng),數(shù)據(jù)庫系統(tǒng)。

三、常用的使用方式

(1)懶漢式

這是在開發(fā)中很容易就能寫出來的一種方式,如下

public class Singleton { 
 
  /* 持有私有靜態(tài)實例,防止被引用,此處賦值為null,目的是實現(xiàn)延遲加載 */ 
  private static Singleton instance = null; 
 
  /* 私有構(gòu)造方法,防止被實例化 */ 
  private Singleton() { 
  } 
 
  /* 1:懶漢式,靜態(tài)工程方法,創(chuàng)建實例 */ 
  public static Singleton getInstance() { 
    if (instance == null) { 
      instance = new Singleton(); 
    } 
    return instance; 
  } 
} 

調(diào)用:

Singleton.getInstance().method(); 

優(yōu)點:延遲加載(需要的時候才去加載)

缺點: 線程不安全,在多線程中很容易出現(xiàn)不同步的情況,如在數(shù)據(jù)庫對象進(jìn)行的頻繁讀寫操作時。

(2)加同步鎖

既然線程不安全,那就加上同步鎖,一種加法如下:

/*2.懶漢式變種,解決線程安全問題**/ 
 public static synchronized Singleton getInstance() { 
   if (instance == null) { 
     instance = new Singleton(); 
   } 
   return instance; 
 } 

更一般的寫法是這樣

/*加上synchronized,但是每次調(diào)用實例時都會加載**/ 
 public static Singleton getInstance() { 
   synchronized (Singletonclass) { 
     if (instance == null) { 
       instance = new Singleton(); 
     } 
   } 
   return instance; 
 } 

調(diào)用:

Singleton.getInstance().method(); 

優(yōu)點:解決了線程不安全的問題。

缺點:效率有點低,每次調(diào)用實例都要判斷同步鎖

補充:在Android源碼中使用的該單例方法有:InputMethodManager,AccessibilityManager等都是使用這種單例模式

(3)雙重檢驗鎖

要優(yōu)化(2)中因為每次調(diào)用實例都要判斷同步鎖的問題,很多人都使用下面的一種雙重判斷校驗的辦法

/*3.雙重鎖定:只在第一次初始化的時候加上同步鎖*/ 
 public static Singleton getInstance() { 
   if (instance == null) { 
     synchronized (Singletonclass) { 
       if (instance == null) { 
         instance = new Singleton(); 
       } 
     } 
   } 
   return instance; 
 } 

這種方法貌似很完美的解決了上述效率的問題,它或許在并發(fā)量不多,安全性不太高的情況能完美運行,但是,這種方法也有不幸的地方。問題就是出現(xiàn)在這句

instance = new Singleton(); 

在JVM編譯的過程中會出現(xiàn)指令重排的優(yōu)化過程,這就會導(dǎo)致當(dāng) instance實際上還沒初始化,就可能被分配了內(nèi)存空間,也就是說會出現(xiàn) instance !=null 但是又沒初始化的情況,這樣就會導(dǎo)致返回的 instance 不完整

調(diào)用:

Singleton.getInstance().method(); 

優(yōu)點:在并發(fā)量不多,安全性不高的情況下或許能很完美運行單例模式

缺點:不同平臺編譯過程中可能會存在嚴(yán)重安全隱患。

補充:在android圖像開源項目Android-Universal-Image-Loader中使用的是這種方式。

(4)內(nèi)部類的實現(xiàn)

內(nèi)部類是一種好的實現(xiàn)方式,可以推薦使用一下:

public class SingletonInner { 
 
  /** 
   * 內(nèi)部類實現(xiàn)單例模式 
   * 延遲加載,減少內(nèi)存開銷 
   * 
   * @author xuzhaohu 
   * 
   */ 
  private static class SingletonHolder { 
    private static SingletonInner instance = new SingletonInner(); 
  } 
 
  /** 
   * 私有的構(gòu)造函數(shù) 
   */ 
  private SingletonInner() { 
 
  } 
 
  public static SingletonInner getInstance() { 
    return SingletonHolderinstance; 
  } 
 
  protected void method() { 
    Systemoutprintln("SingletonInner"); 
  } 
} 

調(diào)用:

SingletonInner.getInstance().method(); 

優(yōu)點:延遲加載,線程安全(java中class加載時互斥的),也減少了內(nèi)存消耗

(5)枚舉的方法

這是網(wǎng)上很多人推薦的一種做法,但是貌似使用的不廣泛,大家可以試試,

/** 
 * @function:單例模式枚舉實現(xiàn) 
 * @author xuzhaohu 
 * 
 */ 
public enum SingletonEnum { 
  /** 
   * 從Java5開始支持; 
   * 無償提供序列化機(jī)制; 
   * 絕對防止多次實例化,即使在面對復(fù)雜的序列化或者反射攻擊的時候; 
   */ 
 
  instance; 
 
  private String others; 
 
  SingletonEnum() { 
 
  } 
 
  public void method() { 
    Systemoutprintln("SingletonEnum"); 
  } 
 
  public String getOthers() { 
    return others; 
  } 
 
  public void setOthers(String others) { 
    thisothers = others; 
  } 
} 

調(diào)用:

SingletonEnum.instance.method(); 

優(yōu)缺點:如代碼中注釋。

上面主要講了單例模式5種創(chuàng)建方法,大家可以根據(jù)其優(yōu)缺點進(jìn)行個人實際項目中的使用。講的屬于拋磚引玉,大家多提意見。

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

相關(guān)文章

  • Android Studio實現(xiàn)簡易計算器

    Android Studio實現(xiàn)簡易計算器

    這篇文章主要為大家詳細(xì)介紹了Android Studio實現(xiàn)簡易計算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Flutter實現(xiàn)紅包動畫效果的示例代碼

    Flutter實現(xiàn)紅包動畫效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Flutter實現(xiàn)紅包的動畫效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • ToolBar使用方法詳解

    ToolBar使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android中ToolBar的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android樣式和主題之選擇器的實例講解

    Android樣式和主題之選擇器的實例講解

    今天小編就為大家分享一篇關(guān)于Android樣式和主題之選擇器的實例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Android中控件GridView實現(xiàn)設(shè)置行列分割線的方法示例

    Android中控件GridView實現(xiàn)設(shè)置行列分割線的方法示例

    這篇文章主要介紹了利用Android中控件GridView實現(xiàn)設(shè)置行列分割線的方法,文中給出了詳細(xì)的介紹與示例代碼,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。
    2017-01-01
  • Android本地驗證碼的生成代碼

    Android本地驗證碼的生成代碼

    這篇文章主要為大家詳細(xì)介紹了Android本地驗證碼的生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Android通用索引欄實現(xiàn)代碼

    Android通用索引欄實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Android通用索引欄實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android下拉阻尼效果實現(xiàn)原理及簡單實例

    Android下拉阻尼效果實現(xiàn)原理及簡單實例

    這篇文章主要為大家詳細(xì)介紹了Android下拉阻尼效果實現(xiàn)原理及簡單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • android 圖片操作(縮放移動) 實例代碼

    android 圖片操作(縮放移動) 實例代碼

    android 圖片操作(縮放移動) 實例代碼,需要的朋友可以參考一下
    2013-06-06
  • Android Studio實現(xiàn)簡易登錄界面制作

    Android Studio實現(xiàn)簡易登錄界面制作

    這篇文章主要為大家詳細(xì)介紹了Android Studio實現(xiàn)簡易登錄界面制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論