1. 程式人生 > 實用技巧 >Java23種設計模式之「單例模式」

Java23種設計模式之「單例模式」

單例模式 之 holder 模式 (推薦)

/**
 * 單例模式 之 holder 模式
 *   帶有 Holder 的方法,
 *   類級內部類,靜態的成員內部類,該內部類的例項與外部類的例項沒有繫結關係
 *   只有在呼叫的時候才會被封裝,從而實現了延遲載入,即懶漢式
 *
 *   holder方式的單例模式是最好的設計之一,也是目前用的比價廣泛的設計之一
 *
 * 優點:
 *
 * 缺點:
 *
 * 注:
 *  final 修飾,不允許被繼承
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfHolder {

    private static class SingletonModeOfHolderIn {
        
        /**
         * 靜態初始化,由JVM來保證執行緒安全
         */
        public static final SingletonModeOfHolder INSTANCE =
                new SingletonModeOfHolder();
    }

    public static SingletonModeOfHolder getInstance() {
        return SingletonModeOfHolderIn.INSTANCE;
    }

    public SingletonModeOfHolder() { }
}

單例模式 之 飽漢模式(懶漢模式)

/**
 * 單例模式 之 飽漢模式(懶漢模式)
 *
 * 優點:
 *   啟動快,資源佔用小,使用時才例項,無鎖
 *
 * 缺點:
 *   非執行緒安全的,多執行緒下不能保證單例的唯一性
 *
 * 注:
 *   final 修飾,不允許被繼承
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfFull {

    private static SingletonModeOfFull instance = null;

    public SingletonModeOfFull getInstance () {
        if (instance == null) {
            instance = new SingletonModeOfFull();
        }
        return instance;
    }

    public SingletonModeOfFull() {}
}

單例模式 之 雙重鎖檢查 (Double Check Lock)

/**
 * 單例模式 之 飽漢模式(懶漢模式) 執行緒安全 雙重鎖檢查 (Double Check Lock)
 *
 * 優點:
 *   懶載入,執行緒安全
 *
 * 缺點:
 *
 * 注:
 *   例項必須有 volatile 關鍵字修飾,保證初始化完全,保證了變數的可見性(visibility)
 *   被 volatile 關鍵字修飾的變數,如果值發生了變化,其他執行緒立馬可見
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfFullDCL {

    private volatile static SingletonModeOfFullDCL instance = null;

    public static SingletonModeOfFullDCL getInstance() {

        // 判斷例項是否存在,如果不存在進入下面的同步塊
        if (instance == null) {

            // 同步 執行緒安全的建立例項
            synchronized (SingletonModeOfFullDCL.class) {

                // 再次檢查例項是否存在
                if (instance == null) {
                    instance = new SingletonModeOfFullDCL();
                }
            }
        }
        return instance;
    }

    public SingletonModeOfFullDCL() {}
}

單例模式 之 飽漢模式(懶漢模式) 執行緒安全

/**
 * 單例模式 之 飽漢模式(懶漢模式) 執行緒安全
 *
 * 優點:
 *   啟動快,資源佔用小,使用時才例項,有鎖
 *
 * 缺點:
 *   synchronized 為獨佔排他鎖,併發性差,即使在建立成功之後,獲取例項仍然是序列化操作
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfFullSafe {

    private static SingletonModeOfFullSafe instance = null;

    public static synchronized SingletonModeOfFullSafe getInstance() {
        if (instance == null) {
            instance = new SingletonModeOfFullSafe();
        }
        return instance;
    }

    public SingletonModeOfFullSafe() {}
}

單例模式 之 餓漢模式

/**
 * 單例模式 之 餓漢模式
 *
 * 優點:
 *   餓漢模式天生是執行緒安全的,使用時沒有延遲
 *
 * 缺點:
 *   時候即建立例項,啟動慢,有可能造成資源浪費
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfHungry {

    /**
     * 類載入即建立物件
     */
    private final static SingletonModeOfHungry INSTANCE = new SingletonModeOfHungry();

    /**
     * 提供給外接獲取物件的方法
     */
    public static SingletonModeOfHungry getInstance() {
        return INSTANCE;
    }

    /**
     * 私有化構造器 防止外接建立物件
     */
    private SingletonModeOfHungry() {

    }

}