【设计模式】 单例模式好好总结一下

自己理解

单例模式顾名思义,就是在任何时候单例模式的类的有且只能有一个实例,就是单例模式。

自己理解优点

  • 减少内存占用
  • 提高系统性能
  • 实际应用,比如整个系统只需要创建一个实例的情况,或者创建某个实例消耗资源过大... 都可以根据自己的实际应用来制定是否需要用单例模式。

自己思考

知道概念,接下来就是如何创造这个类,这个类和其他类有什么不同。

  • 构造方法私有化。因为这个类有且只能有一个实例,所以要保证构造方法不能对外开放。
  • 访问对象的方法指向唯一的实例。
  • 如何构造这个实例,是在类加载的时候?还是在第一个获取实例对象的时候?

创建方式

1、饿汉式

就是在类加载的过程中创建对象。

实例作为静态变量创建

  • 这种构建方式能通过反射的方式来破坏单例模式内部结构。
java 复制代码
public class Demo {

    /**
     * 构造方法私有化
     */
    private Demo() {
    }

    /**
     * 构造实例 - 类加载过程中
     */
    private static Demo demo = new Demo();

    /**
     * 获取实例方法
     * @return
     */
    public static Demo getDemo(){
        return demo;
    }

    public void mess(){
        System.out.println("hello");
    }
}

实例在静态代码块创建

  • 这种构建方式能通过反射的方式来破坏单例模式内部结构。
java 复制代码
public class Demo {

    /**
     * 构造方法私有化
     */
    private Demo() {
    }

    /**
     * 实例变量
     */
    private static Demo demo;

    /**
     * 类加载过程中 创建实例对象
     */
    static {
        demo = new Demo();
    }

    /**
     * 获取实例方法
     * @return
     */
    public static Demo getDemo(){
        return demo;
    }

    public void mess(){
        System.out.println("hello");
    }
}

枚举的方式创建 (*推荐)

  • 枚举的方式可以避免反射来破坏内部结构。
java 复制代码
public enum Demo {

    DEMO;

    public void mess(){
        System.out.println("hello");
    }
}

2、懒汉式

就是在使用实例的时候才创建这个实例。

创建方式 - 线程不安全

java 复制代码
public class Demo {

    private static Demo demo;

    /**
     * 私有构造方法
     */
    private Demo(){}

    /**
     * 线程不安全
     * 在第一次使用实例对象的时候创建实例
     * @return
     */
    public static Demo getDemo(){
        if(demo == null){
            demo = new Demo();
        }
        return demo;
    }

    public void mess(){
        System.out.println("hello");
    }
}

创建方式 - 线程安全 (* 推荐)

java 复制代码
public class Demo {

    private static Demo demo;

    /**
     * 私有构造方法
     */
    private Demo(){}

    /**
     * 重量级锁 synchronized
     * 在第一次使用实例对象的时候创建实例
     * @return
     */
    public static synchronized Demo getDemo(){
        if(demo == null){
            demo = new Demo();
        }
        return demo;
    }

    public void mess(){
        System.out.println("hello");
    }
}

比较两种创建方式

我主张的一般都是根据实际业务需要、服务器内存使用情况和系统开销来确定使用哪种方式,但是一般情况下,我觉得在业务量不大的情况下,无脑饿汉式足够使用了,更为推荐的是饿汉式中的枚举创建,简单、有效、成熟、而且代码量少。

相关推荐
我叫黑大帅10 小时前
为什么TCP是三次握手?
后端·网络协议·面试
我叫黑大帅10 小时前
如何排查 MySQL 慢查询
后端·sql·面试
一 乐10 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
恼书:-(空寄10 小时前
JVM GC 日志分析 + 常见 GC 场景 + 实战参数调优
java·jvm
消失的旧时光-194310 小时前
Spring Boot 实战(五):接口工程化升级(统一返回 + 异常处理 + 错误码体系 + 异常流转机制)
java·spring boot·后端·解耦
杨凯凡12 小时前
【012】图与最短路径:了解即可
java·数据结构
比特森林探险记12 小时前
【无标题】
java·前端
椰猫子12 小时前
Javaweb(Filter、Listener、AJAX、JSON)
java·开发语言
朝新_13 小时前
【Spring AI 】核心知识体系梳理:从入门到实战
java·人工智能·spring
一 乐13 小时前
旅游|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
java·vue.js·spring boot·论文·旅游·毕设·旅游信息推荐系统