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、若涉及到反序列化创建对象时,可以使用枚举类,但是它类似饿汉式的,线程安全,但是内存浪费。
posted @ 2020-09-17 19:21  码在江湖  阅读(137)  评论(0)    收藏  举报