設計模式–>單例設計模式

原文連接:設計模式–>單例設計模式
設計模式入門:單例設計模式

單例設計模式解決的問題:
jvm虛擬機內,只許創建一個對象(保證一個類僅有一個實例,並提供一個訪問它的全局訪問點)
就是說,只允許 此類,只能new一個對象!!
設計思想:
)1:私有化默認構造器,不允許外界訪問。
)2:設置外部靜態訪問對象。
)3:創建外部訪問對象,並判斷是否已經存在。

public class SingleModel {

    /**
     * 單例設計模型:
     * 解決問題:在jvm虛擬機內,只許創建一個對象(保證一個類僅有一個實例,並提供一個訪問它的全局訪問點)
     * <p>
     * <p>
     * 設計思想:
     * 1、私有化默認構造器,不讓外界無限訪問創建
     * 2、提供單個訪問接口
     * 3、首次創建對象類,採用懶加載
     * <p>
     * 優點:對外保證一個實例對象
     * 缺點:多線程同時訪問,可能造成多個實例
     * <p>
     * 應用場景:
     * 參數、多出應用的參數、
     * *
     */
    private String name;
    private String age;

    private static SingleModel singleModel;

    //私有化構造器:
    //注意:一般開發中,如果要創建,設爲public
    private SingleModel() {
    }

    //創建外部訪問對象
    public static SingleModel getInstance() {
        if (singleModel == null) {
            //懶加載
            return new SingleModel();
        }
        return singleModel;
    }
    //<請加上,get,set方法,這裏省略>;
}

2、改進:變爲線程安全實例

改進思想:在外部調用方法上加鎖synchronized

產生新問題:每次加鎖線程會產生上下文切換的開銷

改進思想:判空處理

//創建外部訪問對象
public static SingleModelSyn getInstance() {
    //解決線程上下文切換,所產生的時間開銷
    if (singleModel == null) {
        //加鎖線程鎖,解決多線程創建多個實例
        synchronized (SingleModelSyn.class) {
            if (singleModel == null) {
                //懶加載
                return new SingleModelSyn();
            }
        }
    }
    return singleModel;
}
/*//餓漢模式:以空間換時間做法
private static SingleModelProSyn singleModel = new SingleModelProSyn();

private SingleModelProSyn() {
}

public static SingleModelProSyn getInstance() {
    return singleModel;
}*/

3、額外改進,創建自定義個實例

public class SingleModelPro {
    /**
     * 改進:單例創建多個單例對象
     * *
     */
    private String name;
    private String age;
    private static int maxNumberSingleModelProTow = 2;//最大創建數
    private static int number = 1;//首次創建個數
    //創建一個map集合,用來存儲創建好的實例
    public static Map<String, SingleModelPro> singleModelMap = new HashMap<>();

    //私有化構造器:
    private SingleModelPro() {

    }

    //創建外部訪問對象
    public static SingleModelPro getInstance() {
        //直接獲取靜態key值
        SingleModelPro singleModelPro = singleModelMap.get(number);
        if (singleModelPro == null) {
            //如果爲空,new一個對象,number做key,對象做value
            singleModelPro = new SingleModelPro();
            singleModelMap.put(number + "", singleModelPro);
        }
        number++;
        //循環在1-2之間
        if (number > maxNumberSingleModelProTow) {
            number = 1;
        }

        return singleModelPro;
    }

 //<請加上,get,set方法,這裏省略>;
}

面向開發過程,記錄學習之路。

發佈了91 篇原創文章 · 獲贊 64 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章