首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >23种设计模式之单例模式

23种设计模式之单例模式

作者头像
紫风
发布2025-10-14 15:23:50
发布2025-10-14 15:23:50
12200
代码可运行
举报
运行总次数:0
代码可运行

下是 单例模式 (Singleton Pattern) 的详细介绍,包括定义、优缺点、应用场景及代码实现:


一、单例模式概述
  • 英文名称:Singleton
  • 核心目标:确保一个类仅有一个实例,并提供全局访问点。
  • 设计思想:通过私有化构造方法静态方法控制实例化,保证全局唯一性。

二、优缺点
优点
  1. 全局唯一性:避免重复创建对象,节省资源(如配置管理、线程池等场景)。
  2. 延迟加载:某些实现方式支持按需创建实例(如懒汉式)。
  3. 严格访问控制:集中管理共享资源(如数据库连接池)。
缺点
  1. 违反单一职责原则:单例类可能承担过多职责。
  2. 测试困难:全局状态可能影响单元测试的独立性。
  3. 线程安全问题:需注意多线程环境下的同步处理(如懒汉式)。

三、应用场景
  1. 配置管理:全局唯一的配置信息对象。
  2. 日志记录器:统一管理日志写入。
  3. 线程池/连接池:共享资源的管理。
  4. 硬件控制:如打印机后台服务。

四、代码实现与注释

以下是 5 种常见实现方式,针对不同场景选择:

1. 懒汉式(线程不安全)
代码语言:javascript
代码运行次数:0
运行
复制
public class LazySingleton {
    private static LazySingleton instance;

    // 私有构造方法,禁止外部直接实例化
    private LazySingleton() {}

    // 全局访问点(线程不安全)
    public static LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}
2. 饿汉式(线程安全)
代码语言:javascript
代码运行次数:0
运行
复制
public class EagerSingleton {
    // 类加载时直接初始化实例(线程安全)
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}

    public static EagerSingleton getInstance() {
        return instance;
    }
}
3. 双重检查锁(线程安全,延迟加载)
代码语言:javascript
代码运行次数:0
运行
复制
public class DoubleCheckedSingleton {
    // volatile 防止指令重排序
    private static volatile DoubleCheckedSingleton instance;

    private DoubleCheckedSingleton() {}

    public static DoubleCheckedSingleton getInstance() {
        if (instance == null) { // 第一次检查,避免不必要的同步
            synchronized (DoubleCheckedSingleton.class) {
                if (instance == null) { // 第二次检查,确保线程安全
                    instance = new DoubleCheckedSingleton();
                }
            }
        }
        return instance;
    }
}
4. 静态内部类(线程安全,延迟加载)
代码语言:javascript
代码运行次数:0
运行
复制
public class StaticInnerClassSingleton {
    private StaticInnerClassSingleton() {}

    // 静态内部类在首次调用 getInstance() 时加载
    private static class SingletonHolder {
        private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
5. 枚举(最佳实践,防止反射攻击)
代码语言:javascript
代码运行次数:0
运行
复制
public enum EnumSingleton {
    INSTANCE; // 单例实例

    // 添加业务方法
    public void doSomething() {
        System.out.println("Singleton is working");
    }

    // 使用示例:
    public static void main(String[] args) {
        EnumSingleton.INSTANCE.doSomething();
    }
}

五、代码实现对比

实现方式

线程安全

延迟加载

防止反射攻击

代码复杂度

懒汉式

✔️

饿汉式

✔️

双重检查锁

✔️

✔️

静态内部类

✔️

✔️

枚举

✔️

✔️

极低


六、注意事项
  1. 序列化问题:反序列化可能破坏单例,需实现 readResolve() 方法。
  2. 反射攻击:通过反射调用构造方法可绕过限制,枚举天然防御此问题。
  3. 多类加载器:不同类加载器可能导致多个实例(需统一类加载器)。

七、总结
  • 推荐方式:优先使用 枚举 或 静态内部类 实现单例。
  • 线程安全:在高并发场景下选择双重检查锁或静态内部类。
  • 简单场景:饿汉式足够且高效。

单例模式是高频面试考点,理解其原理和实现细节对实际开发有重要意义。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、单例模式概述
  • 二、优缺点
    • 优点:
    • 缺点:
  • 三、应用场景
  • 四、代码实现与注释
    • 1. 懒汉式(线程不安全)
    • 2. 饿汉式(线程安全)
    • 3. 双重检查锁(线程安全,延迟加载)
    • 4. 静态内部类(线程安全,延迟加载)
    • 5. 枚举(最佳实践,防止反射攻击)
  • 五、代码实现对比
  • 六、注意事项
  • 七、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档