当前位置: 首页 > article >正文

Java中的设计模式:单例模式详解

摘要

单例模式(Singleton Pattern)是Java中最常用的设计模式之一,属于创建型模式。它的主要目的是确保一个类在系统中只有一个实例,并提供一个全局访问点来访问该实例。

1. 单例模式的定义

单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一的实例。这种模式可以应用于那些需要频繁实例化然后销毁的对象,或者那些创建对象时需要消耗大量资源的情况。

2. 单例模式的主要特点
  • 唯一实例:保证一个类仅有一个实例。
  • 自行创建:单例类必须自己创建自己的唯一实例。
  • 全局访问:单例类必须向所有其他对象提供这一实例。
3. 单例模式的实现方式

单例模式有多种实现方式,常见的有以下几种:

3.1 饿汉式(Eager Initialization)

饿汉式在类加载时就创建了单例实例,因此它是线程安全的。

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
3.2 懒汉式(Lazy Initialization)

懒汉式在第一次调用 getInstance 方法时才创建实例,但这种方式不是线程安全的。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
3.3 线程安全的懒汉式

通过添加同步锁来确保线程安全,但性能较差。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
3.4 双重检查锁定(Double-Checked Locking)

双重检查锁定既实现了延迟初始化,又保证了线程安全。

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
3.5 静态内部类(Static Inner Class)

利用JVM的类加载机制保证线程安全,同时避免了同步带来的性能影响。

public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
3.6 枚举(Enum)

使用枚举是最简单且最安全的方式,天然支持序列化和防止反射攻击。

public enum Singleton {
    INSTANCE;

    // 其他方法
}
4. 单例模式的优点
  • 减少内存开销:只创建一个实例,节省系统资源。
  • 控制访问:可以对单例实例进行严格控制,例如限制并发访问。
  • 简化配置:不需要每次使用时都进行配置,只需配置一次即可。
5. 单例模式的缺点
  • 扩展困难:由于构造函数私有化,难以继承或扩展。
  • 可能引起内存泄漏:如果单例持有外部资源,可能会导致资源无法释放。
  • 测试困难:单例模式使得代码的单元测试变得复杂,因为很难模拟单例的行为。
6. 单例模式的应用场景
  • 日志记录器:在整个应用程序中只需要一个日志记录器实例。
  • 配置管理器:读取和存储配置信息的类通常只需要一个实例。
  • 数据库连接池:管理数据库连接的类通常只需要一个实例。
  • 缓存:缓存系统通常只需要一个实例来管理缓存数据。
  • 对话框:如文件选择对话框等,通常只需要一个实例。
7. 总结

单例模式是一种简单而强大的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。通过不同的实现方式,可以在不同场景下选择最适合的方式来实现单例模式。虽然单例模式有一些缺点,但在很多情况下,它仍然是解决特定问题的有效工具。


http://www.kler.cn/news/365859.html

相关文章:

  • 51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25
  • 10分钟使用Strapi(无头CMS)生成基于Node.js的API接口,告别繁琐开发,保姆级教程,持续更新中。
  • Python实现微博舆情分析的设计与实现
  • 设计模式(二)工厂模式详解
  • 淘宝API的实战应用:数据驱动增长,实时监控商品信息是关键
  • RHCE-web篇
  • VScode插件:前端每日一题
  • List线性表
  • 单片机_RTOS__架构概念
  • mongodb高可用副本集 docker版
  • linux下的进程等待(wait、waitpid)
  • Vue 3项目的性能监测和优化
  • 日常记录:es TransportClient添加证书处理
  • vscode 配置构建、调试QT项目
  • uniapp renderjs页面传值
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (七):MongoDB的设置
  • 虚拟化基础
  • java List<Map<String, Object>> 转 List<JSONObject> 的几种方式
  • Log4j和SLF4J在Java中打印日志的区别
  • Node.js是什么? 能做什么?
  • Harmony 开发与H5进行交互
  • OneNote不能拖动页面解决方案
  • docker-compose安装sentinel
  • Springcloud健身小程序-计算机毕业设计源码27368
  • linux中级wed服务器(https搭建加密服务器)
  • Spring Boot 中应用单元测试(UT):结合 Mock 和 H2 讲解和案例示范