23种设计模式-单例(Singleton)设计模式

🚩什么是单例设计模式?

单例模式(Singleton Pattern)创建型设计模式,它确保 一个类只有一个实例,并提供 全局访问点 以获取该实例。

使用场景

  • 需要保证全局唯一性的对象,如 日志管理器数据库连接池缓存管理器 等。

  • 需要共享资源,避免创建多个实例导致资源浪费。

  • 需要控制对象的访问,如 线程池,只能有一个管理者控制线程分配。

🚩单例设计模式的特点

  • 全局唯一性:整个应用程序中只能有一个实例。

  • 提供全局访问点:外部只能通过 getInstance() 获取实例。

  • 延迟加载(可选):可以实现 懒加载,只有在需要时才创建实例,减少资源占用。

  • 线程安全(可选):可以采用 同步机制 确保在多线程环境下仍然保证唯一性。

🚩单例设计模式的结构

单例模式主要包含以下部分:

  • Singleton(单例类):提供 私有构造方法,确保外部不能创建对象,并提供 公共 getInstance() 方法 访问唯一实例。

  • Client(客户端):通过 getInstance() 方法访问单例对象。

图例:

在这里插入图片描述

SingletonPattern不能实例化Singleton,只能通过getInstance()访问

🚩单例设计模式的优缺点

✅ 优点

  • 全局唯一性:保证只有一个实例,避免资源浪费。

  • 控制实例个数:防止创建多个对象,影响性能或逻辑错误。

  • 提供全局访问点:可以随时访问,无需每次创建新实例。

❌ 缺点

  • 可能引起全局状态问题:单例是 全局对象,在某些情况下可能导致难以调试的状态问题。

  • 不适用于多线程(非线程安全实现):如果不加锁,多线程环境下可能会创建多个实例。

  • 增加代码复杂度:如果实现线程安全的单例模式(如 双重检查锁定),代码会变得更复杂。

🚩单例设计模式的Java实现

代码地址:GitHub

  • 创建单例类,instance 存储唯一实例,确保全局唯一性,private Singleton() 防止外部创建新实例,getInstance() 提供全局访问点。
/**
 * @author hanson
 * @description:
 * @date 2025-03-23 23:37:21
 * @version: 1.0
 */
public class Singleton {

    private int number = 2025;

    public void setNumber(int number) {
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

    // 1. 创建私有静态实例
    private static Singleton instance = new Singleton();

    // 2. 构造方法私有化,防止外部实例化
    private Singleton() {
    }

    // 3. 提供公共方法获取实例
    public static Singleton getInstance() {
        return instance;
    }
}
  • 测试单例模式
/**
 * @author hanson
 * @description:
 * @date 2025-03-23 23:39:39
 * @version: 1.0
 */
public class SingletonPattern {

    public static void main(String[] args) {
        // Singleton singleton1 = new Singleton();  // 不能直接实例化

        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        Singleton singleton3 = Singleton.getInstance();

        System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());

        singleton1.setNumber(528);

        System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());
    }
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • 私有静态变量 instance 存储唯一实例,确保全局唯一性。

  • 私有构造方法 private Singleton() 防止外部创建新实例。

  • 公有静态方法 getInstance() 提供全局访问点。

🚩总结

  • 单例模式(Singleton Pattern) 确保 一个类只有一个实例,并提供 全局访问点 获取该实例。

  • 适用于 日志管理器数据库连接池线程池等 需要全局唯一实例的场景。

  • Java 实现 需要 私有化构造方法,并提供 静态方法返回唯一实例

✅ 适用场景:

  • 需要 保证全局唯一性 的对象,如 日志管理器线程池数据库连接池 等。

  • 需要 共享资源,避免创建多个实例导致资源浪费。

  • 需要 控制对象的访问,防止多个实例同时操作数据。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值