天天看點

設計模式--單例模式

@[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);
    }
}
           
設計模式--單例模式

如何選擇單例建立方式

如果不需要延遲加載單例,可以使用枚舉或者餓漢式,相對來說枚舉性好于餓漢式。

如果需要延遲加載,可以使用靜态内部類或者懶韓式,相對來說靜态内部類好于懶韓式。