概念:整個應用中某個類只有乙個例項,自己例項化並且向外提供的一種設計模式
應用場景:當建立乙個物件需要消耗很多資源(比如操作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 雙重鎖定模式 第一次生成完例項以後就直接返回例項...