设计模式——单例模式

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

相关推荐
火烧屁屁啦6 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
w_312345420 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安22 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA26 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_192849990633 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
越甲八千1 小时前
重温设计模式--享元模式
设计模式·享元模式
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴