尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

单例模式(Singleton Pattern)是一种创建型设计模式,其核心目标是确保某类在整个系统中仅存在一个实例

单例模式(Singleton Pattern)是一种创建型设计模式,其核心目标是确保某类在整个系统中仅存在一个实例 B) 单例模式单例模式Singleton Pattern是一种创建型设计模式其核心目标是确保某类在整个系统中仅存在一个实例并提供一个全局可访问的入口点通常通过静态方法如getInstance()实现。常见实现方式包括饿汉式类加载时即创建实例线程安全但可能浪费资源懒汉式首次调用时创建需加锁保证线程安全双重检查锁定DCL兼顾延迟加载与线程安全静态内部类推荐利用类加载机制保证线程安全与懒加载枚举实现最简洁、天然防反射和反序列化破坏该模式适用于配置管理器、日志记录器、数据库连接池等需要统一协调资源的场景但需谨慎使用避免引入全局状态导致测试困难或耦合度升高。枚举方式实现单例能天然防止反射攻击和反序列化破坏根本原因在于 Java 语言规范对enum的特殊保障机制✅防反射攻击Java 的enum类型在编译时被强制继承自java.lang.Enum且其构造方法被编译器设为私有、隐式且仅允许 JVM 在类加载时调用一次。AccessibleObject.setAccessible(true)无法绕过这一限制——反射调用enum构造器会直接抛出java.lang.NoSuchMethodException因构造器不可见或更常见的java.lang.IllegalArgumentException: Cannot reflectively create enum objectsJVM 层面硬性拦截。这是 JVM 规范级保护非普通类可比拟。✅防反序列化破坏Java 序列化机制对enum类型做了特殊处理无论ObjectInputStream如何反序列化永远只返回该枚举类中已声明的常量实例即INSTANCE而不会调用任何构造器或readObject方法。Enum的反序列化逻辑由 JVM 内置实现直接通过Enum.valueOf()查找已有常量完全跳过对象创建流程因此不可能生成新实例。 补充说明普通单例类若未显式防御如在readObject中抛异常、或使用serialVersionUIDreadResolve方法反序列化可能绕过私有构造器生成新实例枚举的values()和valueOf()均为静态方法其返回的实例均由 JVM 在类初始化阶段统一创建并缓存具有绝对唯一性和不可变性。综上枚举单例是 Java 中最简洁、最安全的单例实现兼具线程安全、懒加载首次访问时初始化、防反射、防反序列化、防克隆等全部特性无需额外代码防护。
返回列表