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

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

单例设计模式解决的问题:
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方法,这里省略>;
}

面向开发过程,记录学习之路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值