设计模式——单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,它的核心原理是保证一个类在整个应用中只有一个实例,并提供一个全局访问点。这个模式的主要目的是控制类的实例化过程,确保任何时刻系统中都只有一个该类的实例存在。

原理

在单例模式中,类自身负责保存其唯一实例,并且还向外界提供这个实例。为了防止多个实例被创建,通常会将构造函数设为私有(private),从而阻止其他对象通过new关键字直接实例化该类。然后通过一个静态方法来返回唯一的实例。

Java代码示例 - 饿汉式(静态常量)

java 复制代码
public class Singleton {
    // 创建 Singleton 类的一个对象
    private static final Singleton INSTANCE = new Singleton();

    // 让构造函数为 private,这样该类就不会被实例化
    private Singleton() {}

    // 获取唯一可用的对象
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

假设你经营一家只有一张独特会员卡的俱乐部,这张卡代表了俱乐部的唯一入口。为了让所有人都只能使用这张卡进入俱乐部,你会把这张卡藏起来(构造函数私有化),并且设置一个前台接待员(静态方法

getInstance()),谁需要进俱乐部,都得通过接待员获取这张卡。这样一来,无论多少人来申请,接待员每次都会给他们同一张卡,确保了俱乐部内部不会有多余的入口出现。

双重检查锁定(DCL, Double-Checked Locking)示例 - 懒汉式(线程安全)

java 复制代码
懒汉式会在第一次请求时才实例化对象,以下是一个线程安全的双重检查版本:

public class Singleton {
    private volatile static Singleton singleton;
    private Singleton() {}

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

在这个例子中,只有当singleton为null且同时有多个线程尝试实例化时,才会进行同步操作,避免了不必要的同步开销。

应用场景

  • 资源管理:如数据库连接池、线程池等,它们都需要保证在整个程序运行期间只初始化一次。
  • 配置类:应用中的全局配置信息类,往往只需要一个实例,方便统一管理和修改。
  • 日志系统:为了避免多实例打印混乱,日志对象经常采用单例模式实现。
  • 工具类或服务类:例如Web应用中的缓存服务、Session管理服务等。

适用性

单例模式适用于那些需要严格控制全局状态、共享资源且这些资源在系统生命周期内只需初始化一次的情况。然而,在现代Java编程中,由于并发容器和依赖注入框架的普及,直接使用单例可能会带来测试困难、扩展性问题以及违反面向接口编程的原则,因此在某些情况下,它被视为一种反模式。但在实际开发中,根据具体场景合理选择设计策略仍然十分重要。

相关推荐
都叫我大帅哥1 小时前
Java JJWT 完全指南:从入门到生产级实践
java
前端开发张小七2 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
ThsPool3 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
赤壁小虾4 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
青山木5 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Jul1en_5 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 管理 Spring Boot 应用 阅读笔记
java·spring boot·笔记
XWalnut5 小时前
SpringBoot快速入门
java·spring boot·后端
前端 贾公子5 小时前
第06章:结构化输出 (上)
java·服务器·前端
念何架构之路5 小时前
restartmanager-重启管理子系统
java·开发语言