自学日记:设计模式—单例模式

为什么使用单例模式?

单例模式是指在整个程序运行期间,保证某个类只有一个实例化对象,因此构造方法肯定是私有的,因为外部是无法new出来对象的,所以获取类的方法必须是静态的


常见的引用场景包括:

  1. 程序配置类,使用程序在启动的时候只需要配置一次。也可以理解成程序在启动的时候需要加载的一些东西,一些准备工作。
  2. 连接池、线程池等对象。一个应用程序应该只有一个

这里粗滤提一个概念,类的运行流程:

  1. (类加载)将类的信息加载到内存中,并为每种数据类型划分内存空间
  2. (实例化)将内存中为类的属性设置初始值,即各个数据类型的初始值(int为0,boolean 为false,String默认值为null,对象默认值为null)
  3. (初始化)为类的属性附上我们传入的值(比如说有参构造,这里才是真正我们给定的值),静态代码块或者静态变量是在初始化阶段才被赋值或者执行!

static存在的意义个人理解。
如果说static是为了在初始化前进行赋值或者执行一段代码逻辑,为什么不在构造函数中直接赋值或执行逻辑呢?考虑到构造方法重载,减少代码重复,这样设计也是有必要的。欢迎大佬补充


单例模式的写法

  1. 懒汉式
//在类初始化之后model对象为空对象,在调用getModel方法的时候才进行实例化

public class SingletonModel {

    private static SingletonModel model;

    private SingletonModel(){
		
    }

    public static SingletonModel getModel(){
        if (model==null){
            model= new SingletonModel();
        }
        return model;
    }
}
  1. 饿汉式
//在初始化时就已经new了一个对象了(饿汉,比较急),对象的获取通过getModel方法获得
public class SingletonModel {

    private static SingletonModel model=new SingletonModel();

    private SingletonModel(){

    }

    public static SingletonModel getModel(){
        return model;
    }
}
  1. 双锁机制的单例模式
public class SingletonModel {

    private static SingletonModel model;

    private SingletonModel(){

    }

    public static SingletonModel getModel(){
        if (model==null){
            synchronized (SingletonModel.class){
                if (model==null){ //当model 为空时候,可能会出来多个线程在同步锁处等待,当第一个线程进来创建成功后,model已经不为空,但是第二个线程是等待在同步锁前的,它的判断条件
                    //依然是model为空,所以需要进行第二次判断
                    model=new SingletonModel();
                }
            }
        }
        return model;
    }
}

有不对的地方请各位大佬指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值