设计模式——单例模式

单例模式(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编程中,由于并发容器和依赖注入框架的普及,直接使用单例可能会带来测试困难、扩展性问题以及违反面向接口编程的原则,因此在某些情况下,它被视为一种反模式。但在实际开发中,根据具体场景合理选择设计策略仍然十分重要。

相关推荐
EatFan8 分钟前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
Maiko Star43 分钟前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
现任明教教主~3 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
一条破秋裤3 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
布吉岛的石头3 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
摇滚侠4 小时前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python
二十雨辰5 小时前
[学成在线]-01项目背景
java
弈栈录5 小时前
Java AI 应用的异步化与高并发设计
java·后端·架构
长按助力退休6 小时前
设计模式实战,这 5 个最常用
设计模式
落魄实习生6 小时前
Agent Scope Java 2.x 系列【2】 ReActAgent
java·开发语言