Java 设计模式 | 创建者模式 —— 单例模式

m0_59305477 2026-04-28 22:31:47

 

一、什么是单例模式?

** 单例模式(Singleton Pattern)** 是一种创建型设计模式,其核心是:保证一个类在整个程序中只有一个实例,并提供一个全局访问点获取该实例。

简单理解:

  • 无论在代码哪里获取,拿到的都是同一个对象
  • 避免频繁创建销毁对象,节省内存、提升性能
  • 常用于工具类、配置类、线程池、日志对象、Spring Bean 等

二、单例模式的核心要点

  1. 构造器私有化private),禁止外部 new
  2. 自行创建唯一实例(静态成员变量)
  3. 提供一个全局获取实例的方法public static

三、单例模式的五种经典写法

1. 饿汉式(静态常量)—— 最简单、线程安全

特点:类加载就初始化,天生线程安全,但可能浪费内存。

java

public class Singleton {
    // 1. 静态常量,类加载时就创建
    private static final Singleton INSTANCE = new Singleton();

    // 2. 构造器私有化
    private Singleton() {}

    // 3. 全局访问点
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

优点:简单、线程安全、无锁、效率高缺点:不用也会创建,可能造成内存浪费


2. 懒汉式(线程不安全)—— 用的时候才创建

特点:延迟加载,但多线程下会产生多个实例。

java

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

缺点:多线程并发下会产生多个实例,严禁在多线程环境使用


3. 懒汉式(线程安全,加 synchronized)

在方法上加锁,保证线程安全,但并发效率极低

java

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    // 加锁保证线程安全
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

优点:线程安全缺点:每次获取都加锁,并发性能差


4. 双重检查锁(DCL)—— 推荐使用(最常用)

Double-Check Locking,兼顾线程安全 + 高性能 + 延迟加载。

java

public class Singleton {
    // volatile 禁止指令重排
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        // 第一次检查:不加锁
        if (instance == null) {
            synchronized (Singleton.class) {
                // 第二次检查:加锁后再判断
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

优点

  • 线程安全
  • 延迟加载
  • 高性能(只有第一次会加锁)
  • 企业级开发最常用

注意:必须加 volatile,防止指令重排导致空指针。


5. 静态内部类 —— 优秀、简洁、线程安全

利用类加载机制保证单例,代码极简洁。

java

public class Singleton {
    private Singleton() {}

    // 静态内部类,只有被调用时才加载
    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

优点

  • 线程安全
  • 延迟加载
  • 无锁、效率极高
  • 代码优雅

推荐程度:极高


6. 枚举单例 —— 最完美、防反射、防序列化破坏

java

public enum Singleton {
    INSTANCE;

    public void method() {
        // 业务方法
    }
}

使用:

java

Singleton instance = Singleton.INSTANCE;

优点

  • 最简单
  • 天生线程安全
  • 防反射攻击、防序列化破坏
  • 《Effective Java》推荐最佳单例写法

四、单例模式可能被破坏的情况及防范

  1. 反射破坏反射可以强制调用私有构造器,创建多个对象。防范:枚举单例天然防反射。

  2. 序列化 / 反序列化破坏反序列化会生成新对象。防范:枚举天然防序列化;普通单例重写 readResolve()


五、单例模式的优缺点

优点

  • 内存中只有一个实例,节省资源
  • 避免频繁创建销毁对象,提升性能
  • 全局统一访问,方便管理状态

缺点

  • 扩展性差,很难扩展子类
  • 违背单一职责原则(既要负责业务,又要保证单例)
  • 难以进行单元测试

六、适用场景

  • 配置信息类(全局只加载一次)
  • 线程池、连接池、缓存
  • 日志工具类
  • Spring 中的 Bean(默认单例)
  • 对话框、处理器等全局唯一对象

七、总结(极简记忆)

  1. 单例 = 一个类只有一个实例
  2. 三要素:私有构造 + 静态实例 + 全局获取方法
  3. 常用写法:
    • 饿汉式:简单、无锁、可用
    • 懒汉式:线程不安全,不推荐
    • 双重检查锁(DCL):企业最常用
    • 静态内部类:优秀推荐
    • 枚举单例:最完美、防破坏
...全文
11 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
作者:刘伟 基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向对象设计原则之开闭原则 面向对象设计原则之里氏代换原则 面向对象设计原则之依赖倒转原则 面向对象设计原则之接口隔离原则 面向对象设计原则之合成复用原则 面向对象设计原则之迪米特法则 六个创建型模式 六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法模式-Factory Method Pattern 工厂三兄弟之工厂方法模式(一) 工厂三兄弟之工厂方法模式(二) 工厂三兄弟之工厂方法模式(三) 工厂三兄弟之工厂方法模式(四) 抽象工厂模式-Abstract Factory Pattern 工厂三兄弟之抽象工厂模式(一) 工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的唯一性——单例模式 (二) 确保对象的唯一性——单例模式 (三) 确保对象的唯一性——单例模式 (四) 确保对象的唯一性——单例模式 (五) 原型模式-Prototype Pattern 对象的克隆——原型模式(一) 对象的克隆——原型模式(二) 对象的克隆——原型模式(三) 对象的克隆——原型模式(四) 建造者模式-Builder Pattern 复杂对象的组装与创建——建造者模式(一) 复杂对象的组装与创建——建造者模式(二) 复杂对象的组装与创建——建造者模式(三) 七个结构型模式 七个结构型模式 适配器模式-Adapter Pattern 不兼容结构的协调——适配器模式(一) 不兼容结构的协调——适配器模式(二) 不兼容结构的协调——适配器模式(三) 不兼容结构的协调——适配器模式(四) 桥接模式-Bridge Pattern 处理多维度变化——桥接模式(一) 处理多维度变化——桥接模式(二) 处理多维度变化——桥接模式(三) 处理多维度变化——桥接模式(四) 组合模式-Composite Pattern 树形结构的处理——组合模式(一) 树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统功能——装饰模式(二) 扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——享元模式(一) 实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式(二) 设计模式之代理模式(三) 设计模式之代理模式(四) 十一个行为型模式 十一个行为型模式 职责链模式-Chain of Responsibility Pattern 请求的链式处理——职责链模式(一) 请求的链式处理——职责链模式(二) 请求的链式处理——职责链模式(三) 请求的链式处理——职责链模式(四) 命令模式-Command Pattern 请求发送者与接收者解耦——命令模式(一) 请求发送者与接收者解耦——命令模式(二) 请求发送者与接收者解耦——命令模式(三) 请求发送者与接收者解耦——命令模式(四) 请求发送者与接收者解耦——命令模式(五) 请求发送者与接收者解耦——命令模式(六) 解释器模式-Interpreter Pattern 自定义语言的实现——解释器模式(一) 自定义语言的实现——解释器模式(二) 自定义语言的实现——解释器模式(三) 自定义语言的实现——解释器模式(四) 自定义语言的实现——解释器模式(五) 自定义语言的实现——解释器模式(六) 迭代器模式-Iterator Pattern 遍历聚合对象中的元素——迭代器模式(一) 遍历聚合对象中的元素——迭代器模式(二) 遍历聚合对象中的元素——迭代器模式(三) 遍历聚合对象中的元素——迭代器模式(四) 遍历聚合对象中的元素——迭代器模式(五) 遍历聚合对象中的元素——迭代器模式(六) 中介者模式-Mediator Pattern 协调多个对象之间的交互——中介者模式(一) 协调多个对象之间的交互——中介者模式(二) 协调多个对象之间的交互——中介者模式(三) 协调多个对象之间的交互——中介者模式(四) 协调多个对象之间的交互——中介者模式(五) 备忘录模式-Memento Pattern 撤销功能的实现——备忘录模式(一) 撤销功能的实现——备忘录模式(二) 撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) 对象间的联动——观察者模式(三) 对象间的联动——观察者模式(四) 对象间的联动——观察者模式(五) 对象间的联动——观察者模式(六) 246 十一个行为型模式 状态模式-State Pattern 处理对象的多种状态及其相互转换——状态模式(一) 处理对象的多种状态及其相互转换——状态模式(二) 处理对象的多种状态及其相互转换——状态模式(三) 处理对象的多种状态及其相互转换——状态模式(四) 处理对象的多种状态及其相互转换——状态模式(五) 处理对象的多种状态及其相互转换——状态模式(六) 策略模式-Strategy Pattern 算法的封装与切换——策略模式(一) 算法的封装与切换——策略模式(二) 算法的封装与切换——策略模式(三) 算法的封装与切换——策略模式(四) 模板方法模式-Template Method Pattern 模板方法模式深度解析(一) 模板方法模式深度解析(二) 模板方法模式深度解析(三) 访问者模式-Visitor Pattern 操作复杂对象结构——访问者模式(一) 操作复杂对象结构——访问者模式(二) 操作复杂对象结构——访问者模式(三) 操作复杂对象结构——访问者模式(四) 设计模式趣味学习(复习) 设计模式趣味学习(复习) 设计模式与足球(一) 设计模式与足球(二) 设计模式与足球(三) 设计模式与足球(四) 设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人联机射击游戏中的设计模式应用(一) 多人联机射击游戏中的设计模式应用(二) 数据库同步系统 设计模式综合实例分析之数据库同步系统(一) 设计模式综合实例分析之数据库同步系统(二) 设计模式综合实例分析之数据库同步系统(三)

151

社区成员

发帖
与我相关
我的任务
社区描述
这里专为新疆政法学院的探索者而建,英雄不问出处。起跑线是起点,热忱与坚持为加速器,无论bug缠身的项目,还是攻克的算法顿悟,每滴汗水皆被珍藏。执炬前行,终将照亮彼此峰顶,我们携手同行。
课程设计笔记经验分享 高校 新疆·图木舒克市
社区管理员
  • 雲中203
  • SHAO060706
  • 三叶草.
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

英雄不问出处

试试用AI创作助手写篇文章吧