您好,登錄后才能下訂單哦!
單例模式是最簡單但同時也是很重要的一種設計模式,優點有以下幾個方面:
1.當內存占用特別大的類需要頻繁地創建銷毀時,單例模式可以節省內存和提高性能,例如myBatis里面的sessionFactory
2.當需要對文件做單一讀寫時,例如同一時間只能同時寫入一個windows文本文件,則需要用單例來避免多重讀寫
缺點是:
1.單例模式沒有接口,很難對其進行拓展。
2.不利于測試,沒辦法直接根據接口mock出一個對象出來測試
最后說下其實現方式主要有餓漢模式和懶漢模式。其中懶漢模式又可以細分為幾種,后面再說。
餓漢模式代碼:
public Class Singleton{ //在類加載時便實例化自身,餓漢模式 private static Class Singletom instance = new Singleton(); private Singleton(){}; public getInstance(){ return this.instance } }
懶漢模式且線程安全代碼1
public Class Singleton{ private static Class Singletom instance = null; private Singleton(){}; public static Singleton getInstance(){ if(instance==null){ //雙重檢測鎖定懶漢模式,如果是直接在getInsance上加鎖,因為有99%的情況是線程安全的,會增加性能消耗,故才有雙重檢測鎖定,優化鎖,讓鎖只在1%的情況才執行 synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } return this.instance } }
懶漢模式且線程安全代碼2
public Class Singleton{ //靜態內部類的方式,應該是因為classLoader的機制使得內部類不會在類 //裝載時便實例化,所以可行 private static Class SingletomLoader(){ private static Singleton instance = new Singleton(); } private Singleton(){}; public static final Singleton getInstance(){ return SingletomLoader.instance } }
總結:spring容器中的bean便使用了單例模式,由spring容器控制其bean的生命周期,而如果設置成多例模式的話,則是交由J2EE容器負責其對象的生命周期。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。