android單例詳解

2021-09-29 04:19:31 字數 1774 閱讀 9268

概念:整個應用中某個類只有乙個例項,自己例項化並且向外提供的一種設計模式

應用場景:當建立乙個物件需要消耗很多資源(比如操作db、io流),某種物件的型別有且應該只有乙個(比如獲取全域性context物件),乙個物件需要頻繁的建立銷毀

特點:1,構造方法私有化  2,自己例項化,對外提供獲取例項的方法

餓漢模式

public class hungryman 

public static hungryman gethungryman()

}

優點:在類載入時就初始化,反應效率快。

缺點:在一定程度上,耗費了資源(類還未被呼叫就被例項化,占用記憶體)。

懶漢模式

public class slacker 

public static synchronized slacker getinstance()

return sinstance;

}}

synchronized:在多執行緒的情況下保證例項的唯一性

優點:呼叫物件的時候再去例項化,與餓漢相比,一定程度上節約了資源。

缺點:1,每次呼叫getinstance()方法,都會進行一次同步,cpu造成了不必要的開銷。2,只有在被呼叫的時候才被例項化,反應比餓漢要慢。

dcl模式(推薦使用

public class slacker 

public static slacker getinstance() }}

return sinstance;

}}

優點:1,呼叫物件的時候再去例項化 2,第乙個if判斷,防止多次同步;第二個if判斷保證了在null的情況下再建立例項

缺點:第一次載入反應稍慢,在**併發場景比較複雜情況下,偶爾會失效,大多數場景下都可以保證單例物件的唯一性

靜態內部類單例模式(推薦使用)

public class innerclass 

public static innerclass getinstance()

private static class innerclassholder

}

優點:第一次載入的時候不會初始化例項,耗費記憶體,呼叫的時候才去例項化,也不存在同步的問題。

缺點:所有單例都有的缺點,容易造成記憶體洩漏,後續會補充。

容器實現單例模式

public class containersingle 

private static hashmapmap = new hashmap<>();

public static void putsingle(string key, object value)

}public static object getsingle(string key)

}

初始化的時候將多個單例物件統一在乙個map中管理,使用者用的時候直接通過介面獲取即可

優點:隱藏了具體的實現,降低了耦合

缺點:所有單例都有的缺點,容易造成記憶體洩漏,後續會補充。

單例模式缺點:

2,單例模式比較難拓展。

Android單例模式詳解

1 設計模式定義 design pattern,是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。使用設計模式是為了可重用 讓 更容易被他人理解 保證 可靠性。毫無疑問,設計模式已於他人於系統都是多贏的 設計模式使 編 正工程化 設計模式是軟體工程的基石脈絡。2 設計模式分類 設計模式...

Android單例模式

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

Android單例模式

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