设计模式–>单例设计模式

原文连接:设计模式–>单例设计模式
设计模式入门:单例设计模式

单例设计模式解决的问题:
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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章