資安

設計模式–單例模式

@[toc]

什麼是單例

保證一個類只有一個實例,並且提供一個訪問該全局訪問點

1.Windows的Task Manager(任務管理器)就是很典型的單例模式
2.windows的Recycle Bin(回收站)也是典型的單例應用。在整個系統運行過程中,回收站一直維護著僅有的一個實例
3.數據庫連接池,線程池,spring(默認單例模式)都是單例

為什麼要設計成單例 ?單例的好處?優缺點?

**單例好處:節約內存,只有一個實例,重複利用,方便管理
缺點:線程安全問題
**

單例創建方式

**1.餓漢式:類初始化時,會立即加載該對象,線程天生安全,調用效率高。
2.懶漢式: 類初始化時,不會初始化該對象,真正需要使用的時候才會創建該對象,具備懶加載功能。
3.靜態內部方式:結合了懶漢式和餓漢式各自的優點,真正需要對象的時候才會加載,加載類是線程安全的。

4.枚舉單例: 使用枚舉實現單例模式 優點:實現簡單、調用效率高,枚舉本身就是單例,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞, 缺點沒有延遲加載。**

1.餓漢式實現

在這裡插入圖片描述

2.懶漢式實現

在這裡插入圖片描述

3.枚舉創建單例

枚舉--定義常量,天生具備JVM保障單例,一般項目定義常量

package com.dimple.Design;

public class SinEnum {

    private SinEnum(){

    }

    public static SinEnum getInstance() {
        return sinEnumPattern.INSTANCE.getInstance();
    }

    private static enum sinEnumPattern {
        INSTANCE;
        // 枚舉元素為單例
        private SinEnum sinEnum;

        private sinEnumPattern() {
            sinEnum = new SinEnum();
        }

        public SinEnum getInstance() {
            return sinEnum;
        }
    }

    public static void main(String[] args) {
        SinEnum u1 = SinEnum.getInstance();
        SinEnum u2 = SinEnum.getInstance();
        System.out.println(u1 == u2);
    }
}

在這裡插入圖片描述

如何選擇單例創建方式

如果不需要延遲加載單例,可以使用枚舉或者餓漢式,相對來說枚舉性好於餓漢式。
如果需要延遲加載,可以使用靜態內部類或者懶韓式,相對來說靜態內部類好於懶韓式。

Leave a Reply

Your email address will not be published. Required fields are marked *