五一放假了,大家是不是因為疫情都減少了出門的頻率那?不出門我們就一起在家學習吧!下面就讓我們從一個問題出發,開始今天的文章吧。你的類有沒有“超生”(到處都是該類的實例)那,它是不是也需要“計劃生育”(只需要一個實例)啊?什么你不會?沒事讓我來告訴你解決類“超生”的辦法,使用單例設計模式。下面讓我們來一起學習一下單例模式。
什么是單例模式?
單例模式是創建類型中常用的一種設計模式。該模式下的類有且僅有一個實例。
優點
python 數據庫連接池。1、可以嚴格控制單例類的使用者怎樣以及何時訪問唯一的實例。
2、只有一個實例,可以節約系統資源,提高系統的性能,減輕GC的壓力。
凡事有利就要弊,單例模式也不可以濫用。
缺點
1、單例模式的擴展性很差,因為沒有抽象層。
2、單例模式在一定程度上違背了“單一職責原則”。
不可以將數據庫連接池對象設計為的單例類,如果共享連接池對象的程序過多會出現連接池溢出的問題。不可以使用反射,這樣會聲明出另一個實例。
Java中哪些是單例的、1、餓漢式
提前創建好類的實例不需要等待創建的時間,直接就可以使用。
/** * 餓漢式(單例模式) */public class HungrySingleton { // 私有構造方法 private HungrySingleton() { } // 創建一個實例 private static final HungrySingleton HUNGRY_SINGLETON_INSTANCE = new HungrySingleton(); /** * 獲取實例的方法 */ public static HungrySingleton getHungrySingleton() { return HUNGRY_SINGLETON_INSTANCE; }}
該方式可能在還不需要此實例的時候就已經將創建出來了,沒有起到懶加載的效果。
2、使用靜態內部類
通過使用靜態內部類的方式優化上面的餓漢式,起到懶加載的效果。
/** * 使用靜態內部類完成單例模式 */public class HungrySingleton { // 私有構造方法 private HungrySingleton() { } // 利用靜態類的加載時機實現懶加載 private static class InnerHungrySingleton{ private static final HungrySingleton HUNGRY_SINGLETON_INSTANCE = new HungrySingleton(); } /** * 獲取實例的方法 */ public static HungrySingleton getHungrySingleton() { return InnerHungrySingleton.HUNGRY_SINGLETON_INSTANCE; }}
3、懶漢式
在第一次使用時創建實例,使用時需要考慮線程安全問題。
/** * 懶漢式(單例模式) */public class LazySingleton { // 私有構造方法 private LazySingleton() { } // 私有靜態屬性 private static LazySingleton lazySingletonInstance; /** * 獲取實例的方法 */ public static LazySingleton getLazySingleton() { // 雙重判斷 if (null == lazySingletonInstance) { synchronized (LazySingleton.class) { if (null == lazySingletonInstance) { lazySingletonInstance = new LazySingleton(); } } } return lazySingletonInstance; }}
該方式起到了懶加載的效果,并且也做了線程安全處理。
python冒泡排序。4、使用枚舉
利用枚舉的特性讓JVM來保證線程安全問題和單一實例的問題。
/** * 使用枚舉實現單例 */public enum SingletonEnum { INSTANCE; private People people; SingletonEnum(){ people = new People(); } public People getPeople() { return people; } // 定義了一個內部類,為了方便代碼展示,也可以是一個獨立的類。 class People { }}
使用枚舉有一個缺點是需要更多的內存空間。
今天的分享就到這里了,看在我五一放假還堅持分享的份上大家能不能給我點個贊啊?
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态