1. 程式人生 > >設計模式--單例的7種模式

設計模式--單例的7種模式

/*
1.	餓漢式:類初始化時,會立即載入該物件,執行緒天生安全,呼叫效率高。
2.	懶漢式: 類初始化時,不會初始化該物件,真正需要使用的時候才會建立該物件,具備懶載入功能。
3.	靜態內部方式:結合了懶漢式和餓漢式各自的優點,真正需要物件的時候才會載入,載入類是執行緒安全的。
4.	列舉單例: 使用列舉實現單例模式 優點:實現簡單、呼叫效率高,列舉本身就是單例,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞, 缺點沒有延遲載入。
5.	雙重檢測鎖方式 (因為JVM本質重排序的原因,可能會初始化多次,不推薦使用)
不需延遲載入 餓漢列舉 延遲載入 靜態內部類比懶漢式更優 實際餓漢
 */
class SingletonDemo1 { //餓漢式
    private static final SingletonDemo1 singleton = new SingletonDemo1();

    private SingletonDemo1() {

    }

    public static SingletonDemo1 getInstance() {
        return singleton;
    }
}

class SingletonDemo2 {//懶漢式 執行緒不安全
    private static SingletonDemo2 singleton;

    private SingletonDemo2() {

    }

    public static SingletonDemo2 getInstance() {
        if (singleton == null)
            singleton = new SingletonDemo2();
        return singleton;
    }
}

class SingletonDemo3 {//懶漢式 執行緒安全
    private static SingletonDemo3 singleton;

    private SingletonDemo3() {

    }

    public static synchronized SingletonDemo3 getInstance() {
        if (singleton == null)
            singleton = new SingletonDemo3();
        return singleton;
    }
}

class SingletonDemo4 { //餓漢式 變種
    private static SingletonDemo4 singleton = null;

    static {
        singleton = new SingletonDemo4();
    }

    private SingletonDemo4() {

    }

    public static SingletonDemo4 getInstance() {
        return singleton;
    }
}

class SingletonDemo5 {//列舉

    static enum ENUM {
        INSTANCE;
        private cn.day18.SingletonDemo5 singleton;

        private ENUM() {
            singleton = new cn.day18.SingletonDemo5();
        }

        public SingletonDemo5 getInstance() {
            return this.singleton;
        }
    }
}

class SingletonDemo6 {//雙重校驗鎖
    private volatile static SingletonDemo6 singleton;

    private SingletonDemo6() {
    }

    public static SingletonDemo6 getSingleton() {
        if (singleton == null) {
            synchronized (SingletonDemo6.class) {
                if (singleton == null) {
                    singleton = new SingletonDemo6();
                }
            }
        }
        return singleton;
    }
}

class SingletonDemo7 {//靜態內部類
    private static class SingletonHolder {
        private static final SingletonDemo7 INSTSNCE = new SingletonDemo7();
    }

    private SingletonDemo7() {
    }

    public static final SingletonDemo7 getInstance() {
        return SingletonHolder.INSTSNCE;
    }