天天看點

Android 單例模式(懶漢式+餓漢式+雙重鎖也就是同步鎖)

一、基礎知識儲備了解一下~~~

(1)設計模式定義:Design pattern,是一套被反複使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人了解、保證代碼可靠性。毫無疑問,設計模式已于他人于系統都是多赢的;設計模式使代碼程式設計真正工程化;設計模式是軟體工程的基石脈絡。

(2)設計模式分類:設計模式總體上可以分為三種,即建立型模式、結構型模式、行為型模式,每種又可以具體分出子類,共計23種。今天我們要分析的單例模式就是建立型模式的一種。

(3)建立型模式的來源及分類:社會化的分工越來越細,自然在軟體設計方面也是如此,是以對象的建立和對象的使用分開也就成為必然趨勢。因為對象的建立會消耗掉系統很多資源,是以單獨對對象的建立進行研究,進而能夠高效地建立對象就是建立型模式要探讨的問題。一共有6個建立型模式—簡單工廠模式;工廠方法模式;抽象工廠模式;建立者模式,原型模式;單例模式

二、單例模式詳解

(1)單例模式定義:Java中單例模式定義:一個類有且僅有一個執行個體,并且自行執行個體化想整個系統提供。

(2)單例模式關鍵點:①某個類隻能有一個執行個體;②它必須自行建立這個示例;③它必須自行向整個系統提供這個執行個體。解決的問題—提供全局需要使用的,唯一的資料通路。

(3)單例模式分類:①懶漢式-在使用時做判斷,如果需要再建立;②餓漢式-在類加載時建立;

代碼實踐:

1.單例模式之餓漢式,餓漢式就是提前建立好封裝類,也就是提前執行個體化本類了,在調用本類之前就已經執行個體化了。就像一個水果,你看見這個水果就直接就吃了;就跟這個類一樣,你建立了這個類就把它執行個體化了是一個意思。下面代碼:

//單例模式(餓漢式)
         private static HttpUtils httpUtils = new HttpUtils(); //這就是提前執行個體化好的
         private HttpUtils(){}
     
         //其實裡面的判斷可以省略,因為上面執行個體已經建立好了,直接傳回httpUtils就行了
         public static HttpUtils getHttpUtils(){
            if (httpUtils==null){
                 httpUtils=new HttpUtils();
             }
             return httpUtils;
         }
           

2.單例模式之懶漢式,懶漢式就是什麼時候調用本類,什麼時候執行個體化本類。就像上面的水果,我什麼時候想吃,什麼時候在拿來吃。代碼如下:

//單例模式(懶漢式)
             private static HttpUtils httpUtils ; //這次可以看出,隻是聲明本類,但沒有執行個體化
             private HttpUtils(){}
         
             //在這個方法裡就行執行個體化本類,如果本類為空也就是本類還沒執行個體化,然後進行執行個體化,傳回。
             public static HttpUtils getHttpUtils(){
                if (httpUtils==null){
                     httpUtils=new HttpUtils();
                 }
                 return httpUtils;
             }
           

3.單例模式加雙重鎖也可以叫雙重檢查鎖(synchronized),也就是在判斷本類是否為空的外面或裡面加一個鎖,也就是可以經過兩次檢查,可以保證線程的安全。代碼如下:

//單例模式(懶漢式)
                 private static HttpUtils httpUtils ; //這次可以看出,隻是聲明本類,但沒有執行個體化
                 private HttpUtils(){}
             
                 //也就是在這裡面多加了一層鎖
                 public static HttpUtils getHttpUtils(){
                 
                 synchronized(HttpUtils.class){
                      if (httpUtils==null){
                             httpUtils=new HttpUtils();
                         }
                 }
                  
                     return httpUtils;
                 }
           

總結

一般來說,單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜态内部類、枚舉。上述所說都是線程安全的實作,文章開頭給出的第一種方法不算正确的寫法。個人認為單例模式主要的也就是前三個,後面兩個沒必要在寫的,如果需要了解可以在網上查查。

就我個人而言,一般情況下直接使用餓漢式就好了,如果明确要求要懶加載(lazy initialization)會傾向于使用靜态内部類,如果涉及到反序列化建立對象時會試着使用枚舉的方式來實作單例。

單例模式也就是這些了,如果喜歡就點贊關注一下,後面我還會不斷更新的!麼麼哒!親們!

繼續閱讀