1. 程式人生 > >(GOF23設計模式)_單例模式_雙重檢查鎖式_靜態內部類式_列舉式

(GOF23設計模式)_單例模式_雙重檢查鎖式_靜態內部類式_列舉式

設計模式

a、建立型模式

單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式

b、結構型模式

介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式

c、行為型模式

模板方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、直譯器模式、
狀態模式、策略模式、職責鏈模式、訪問者模式

1.1、單例模式之雙重檢測鎖實現

這個模式將同步內容內容下到if內部,提高了執行的效率不必每次獲取物件時都進行同步,只有第一次才同步建立了以後就沒必要了

問題:
由於編譯器優化原因和JVM底層內部模型原因,偶爾會出問題,不建議使用

1.2、單例模式之靜態內部類的實現(也是一種懶漢式實現)

要點:
外部類沒有static屬性,則不會像餓漢式那樣立即載入物件
只有真正呼叫了getInstance(),才會載入靜態內部類。
載入類時是執行緒安全的。
instance是static final型別,保證了記憶體中只有這樣一個例項存在,而且只能被賦值一次,
從而保護保證了執行緒安全性兼備了併發高效呼叫和延遲載入的優勢!

SingletonDemo04.java

package junit.matrix.pattern.singleton;

/**
 * 測試靜態內部類實現單例模式 
 * 這種方式:執行緒安全,呼叫效率高,並且實現了延時載入!
 * 
 * SingletonDemo02<BR>
 * 建立人:Matrix <BR>
 * 時間:2016年2月23日-下午5:40:58 <BR>
 * 
 * @version 1.0.0
 *
 */
public class SingletonDemo04 {

    // 靜態內部類
    private static class SingletonClassInstance {
        private static SingletonDemo04 instance = new SingletonDemo04();
    }

    // 私有化構造器
    private SingletonDemo04() {

    }

    // 方法沒有同步,呼叫效率高!
    public static SingletonDemo04 getInstance() {
        return SingletonClassInstance.instance;
    }
}

1.3、單例模式之列舉實現

優點:
實現簡單
列舉本身就是單例模式。由JVM從根本上提供保障!
避免通過反射和反序列化的漏洞!
呼叫效率高!

缺點:
無延遲載入(無懶載入)

SingletonDemo05.java

package junit.matrix.pattern.singleton;

/**
 * 測試列舉式實現單例模式
 * 
 * SingletonDemo02<BR>
 * 建立人:Matrix <BR>
 * 時間:2016年2月23日-下午5:40:58 <BR>
 * 
 * @version 1.0.0
 *
 */
public enum SingletonDemo05 {

    // enum列舉類的一個縮寫

    // 定義一個列舉元素,這個列舉元素本身就是單例物件!
    INSTANCE;

    // 新增自己需要的操作
    public void signletonOperation() {
    }
}

如何選用?

單例物件 佔用 資源少,不需要 延時載入
列舉式 好於 餓漢式(呼叫效率高,不能延時載入)

單例物件 佔用 資源大,需要 延時載入
靜態內部類式(呼叫效率高,可以延時載入) 好於 懶漢式(呼叫效率不高,可以延時載入)