设计模式——单例模式

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

相关推荐
用户37215742613518 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊19 小时前
Java学习第22天 - 云原生与容器化
java
渣哥21 小时前
原来 Java 里线程安全集合有这么多种
java
间彧21 小时前
Spring Boot集成Spring Security完整指南
java
间彧21 小时前
Spring Secutiy基本原理及工作流程
java
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解1 天前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆1 天前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学1 天前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端