java23种设计模式-创建型模式-单例模式
一、简介
单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。
二、优缺点
优点:1.由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统效率,同时也能够严格控制客户对它的访问。
缺点:1.扩展性差了,想扩展每次都得改代码;
2.单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
三、代码实现
1、懒汉式
/** * @author: wsq * @Date: 2020/9/17 13:51 * @Description: 懒汉式,线程不安全,如果想让线程安全加锁即可,但是会及其的影响效率 */ public class LanHan { private LanHan(){ } private static LanHan lanHan; public static LanHan getLanHan(){ if(null == lanHan){ lanHan = new LanHan(); } return lanHan; } }
2、饿汉式
/** * @author: wsq * @Date: 2020/9/17 13:59 * @Description: 单例模式饿汉式,线程安全,但是浪费内存空间 */ public class ErHan { private static ErHan erHan = new ErHan(); private ErHan(){ } public static ErHan getErHan(){ return erHan; } }
3、双重检查
/** * @author: wsq * @Date: 2020/9/17 14:03 * @Description: 双重检查,既节省了内存空间,又解决的线程安全问题,还提升了效率 */ public class DoubleCheck { private volatile static DoubleCheck doubleCheck; private DoubleCheck(){ } public static DoubleCheck getDoubleCheck(){ if(null == doubleCheck){ synchronized (DoubleCheck.class){ if(null == doubleCheck){ doubleCheck = new DoubleCheck(); } } } return doubleCheck; } }
具体为什么使用volatile关键字,看大佬的博客:https://www.cnblogs.com/xz816111/p/8470048.html
4、采用静态内部类的形式
/** * @author: wsq * @Date: 2020/9/17 14:10 * @Description: 静态内部类 */ public class StaticInsideClass { private StaticInsideClass(){ } public static StaticInsideClass getStaticInsideClass() { return insideClass.staticInsideClass; } private static class insideClass{ private static StaticInsideClass staticInsideClass = new StaticInsideClass(); } }
5、采用枚举类的形式
/** * @author: wsq * @Date: 2020/9/17 14:15 * @Description: 枚举类 */ public enum enumClass { ENUM_DEMO(); private enumClass(){ } }
四、从源码的角度分析单例模式
单例模式再SpringBoot中主要的使用,就是类似@Service,@Component,@Configuration和@Bean,这些都用到了单例模式。
五、总结
1、一般情况下,懒汉式(包含线程安全和线程不安全两种方式)都比较少用。
2、饿汉式由于效率较低也不推荐使用。
3、双检锁和内部静态类都可以使用,可根据具体情况自主选择。
4、若涉及到反序列化创建对象时,可以使用枚举类,但是它类似饿汉式的,线程安全,但是内存浪费。