单例模式的五种写法

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

单例的实现主要是通过以下两个步骤

  1. 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
  2. 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

单例模式的五种实现方式

  1.饿汉单例​​​​​​​


/**
 * @author: sfg
 * @create: 2020-12-23 19:40
 **/
public class HungrySingleton {
    private static HungrySingleton hungrySingleton = new HungrySingleton();
    private HungrySingleton(){}
    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }

}

​​​​​  2.懒汉单例


/**
 * @author: sfg
 * @create: 2020-12-22 20:40
 **/
public class LazySingleton {
    private LazySingleton(){}
    private static  LazySingleton LAZY_SINGLETON = null;

    public synchronized static LazySingleton getLazySingleton(){
        if (LAZY_SINGLETON == null){
            LAZY_SINGLETON = new LazySingleton();
        }
        return LAZY_SINGLETON;
    }
}

3.双重检索

/**
 * @author: sfg
 * @create: 2020-12-23 20:46
 **/
public class DoubleCheckSingleton {
    private DoubleCheckSingleton(){}

    private static DoubleCheckSingleton doubleCheckSingleton;

    public static DoubleCheckSingleton getInstance(){
        if (doubleCheckSingleton == null){
            synchronized (DoubleCheckSingleton.class){
                if (doubleCheckSingleton == null){
                    doubleCheckSingleton = new DoubleCheckSingleton();
                }
            }
        }
        return doubleCheckSingleton;
    }

}

4.静态内部类单例模式


/**
 * @author: sfg
 * @create: 2020-12-22 21:03
 **/
public class LazyInnerSingleton {
    private LazyInnerSingleton() {

    }

    public static final LazyInnerSingleton getInstance() {
        return LazyInner.LAZY_INNER_SINGLETON;
    }

    private static final class LazyInner {
        private static final LazyInnerSingleton LAZY_INNER_SINGLETON = new LazyInnerSingleton();
    }

}

5.枚举单例模式

/**
 * @author: sfg
 * @create: 2020-12-23 20:50
 **/
public enum EnumSingleton {
    INSTANCE;

    //可以省略此方法,EnumSingleton.INSTANCE进行操作
    public static EnumSingleton getInstance() {
        return EnumSingleton.INSTANCE;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值