Android的單例模式的N種實現方式

2021-08-01 02:38:13 字數 2967 閱讀 4082

說起androidd的23種設計模式,恐怕大多數人不能說全,但是說起單例模式,大多數人不管是初級開發還是資深開發工程師都應該知道並且使用過。單例模式應該是最簡單也是比較常用的設計模式了。但是你真的了解單例模式嗎?最近看了《android原始碼設計模式》這本書,才發現我原來理解的單例模式太冰山一角了。今天就書中談到的單例模式做一下總結吧。

單例模式的定義及使用場景

定義:確保某個類只有乙個例項,而且自行例項化提供給外部使用。

使用場景:某個型別的物件只應該有且只有乙個,或者避免建立多個物件消耗過多的資源時。如:訪問io或資料庫時要考慮單例模式。

n種實現方式及比較

餓漢式

public class singleton 

//建立私有例項物件

private static final singleton singletoninstance = new singleton();

//對外提供方法,返回例項物件

public static singleton getinstance()

}

優點:簡單,執行緒安全。

缺點:例項物件是static的,在宣告的時候就例項化了,浪費資源。

懶漢式

public class singleton 

//懶漢式

private static synchronized singleton getinstance()

return singletoninstance;

}}

優點:用到的時候才會去例項化,在一定程度上節約了資源。

缺點:getinstance方法是用synchronized修飾的,該方法是同步的,為了保證執行緒安全,但是導致每次呼叫該方法的時候都會被同步,這樣會消耗不必要的資源(不必要的同步開銷)。所以這種模式一般不建議使用。

double check lock(dcl模式):雙重檢查鎖定

public class singleton 

//double check lock

public static singleton getinstance()}}

return singletoninstance;

}}

可以看到getinstance()方法對singletoninstance進行兩次判空,對懶漢式進行了優化,只有在第一次例項化的時候才會走第二個分支,才會同步,避免了每次都同步造成的不必要的資源消耗。

優點:第一次執行getinstance方法時才會例項化,資源利用率高,效率高。

缺點:偶爾失效(高併發條件下,由於jdk版本問題,在jdk1.5之前會失敗)

靜態內部類實現

public class singleton 

public static singleton getinstance()

//靜態內部類

public static class singletonhoulder

}

第一次呼叫getinstance()方法的時候,虛擬機器才會載入singletonhoulder靜態內部類

缺點:

列舉

以上的單例實現方法都沒有考慮乙個因素:反序列化,即使建構函式是私有的,反序列化仍然有特殊的途徑去建立類的乙個新的例項。但是同構列舉實現單例不會有這樣的問題,因為列舉提供了序列化機制。

public enum singleton

具體這點我還不是太理解。以後理解了再分享吧。

使用容器實現單例

public class singletonmanager 

public static void registerservice(string key, object object)

}public static object getservice(string key)

}

將多種單例型別注入到乙個統一的管理類中,使用時根據key獲取對應的物件,這種模式使得我們可以和管理多種型別的單例,並且在使用的時候可以通過統一的介面進行獲取操作,降低了使用者的使用成本,也對使用者隱藏的具體的實現,降低了耦合度。

android原始碼中單例使用

layoutinflater.from(context context);

eventbus.getdefault()

imageloader.getinstance();

......

他們實現單例的方式不同,大家可以去看原始碼

總結

單例模式是使用頻率較高的設計模式,但是由於客戶端通常沒有高併發的情款,選擇哪種實現方式並不會有太大影響。但是出於效率考慮,推薦使用「dcl」和「靜態內部類」實現方式。

單例模式的優點:

1.在記憶體中只有乙個例項,減少記憶體開支

2.只生產乙個例項,減少系統效能的效能開銷

3.避免對資源的多重占用。

4.可以在系統設定全域性的訪問點,優化和共享資源訪問。(例如可以設定乙個單例類,負責所有資料表的對映處理)

單例的缺點;

1.單例一般沒有介面,擴充套件很困難。

關於單例模式的N種實現方式

在開發中經常用到單例模式,單例模式也算是設計模式中最容易理解,也是最容易手寫 的模式,所以也常作為面試題來考。所以想總結一下單例模式的理論知識,方便同學們面試使用。單例模式實現的方式只有兩種型別,一種是餓漢式 類載入時就初始化 一種是懶漢式 類載入時不初始化 餓漢式沒什麼可講究的因為它既簡單也執行緒...

Android單例模式

單例模式singleton 應用場合 有些物件只需要乙個就足夠了,如古代皇帝 老婆 作用 保證整個應用程式中某個例項有且只有乙個 型別 餓漢模式 懶漢模式 public class singleton 2.建立類的唯一例項,使用private static修飾 private static sing...

Android單例模式

參考部落格 1 懶漢模式 每一次呼叫都要對方法進行加鎖,要維護鎖會導致效能損耗,其實不需要每次進入方法都加鎖,只需要第一次進入的時候防止多個執行緒產生多個單例即可。所以只需要在new singleton處加鎖即可,由此引出第二種模式,雙重鎖定模式。2 雙重鎖定模式 第一次生成完例項以後就直接返回例項...