当前位置: 首页 > news >正文

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

单例设计模式

  • 🚩什么是单例设计模式?
  • 🚩单例设计模式的特点
  • 🚩单例设计模式的结构
  • 🚩单例设计模式的优缺点
  • 🚩单例设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是单例设计模式?

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

使用场景

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

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

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

🚩单例设计模式的特点

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

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

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

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

🚩单例设计模式的结构

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

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

  • Client(客户端):通过 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 实现 需要 私有化构造方法,并提供 静态方法返回唯一实例

✅ 适用场景:

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

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

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

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

在这里插入图片描述

相关文章:

  • 文件的分片上传vs流失上传
  • 【2025】基于node.js的中医药科普平台的设计与实现(源码、万字文档、图文修改、调试答疑)
  • 解决Enable-WindowsOptionalFeature : 功能名称 Microsoft-Hyper-V 未知。
  • Linux驱动开发进阶(二) - sysfs文件系统
  • html5炫酷的科技感3D文字效果实现详解
  • ROS多机通信(四)——Ubuntu 网卡 Mesh 模式配置指南
  • 拥抱成长型思维:解锁持续进步的人生密码
  • 于window环境下为tyora下载安装Pandoc
  • cpp11~17 新基础类型--long long
  • go常用标准库学习笔记
  • 3.22-UDP
  • 管家婆工贸ERP PR004.委外完工验收明细表
  • LeetCode 每日一题 2025/3/17-2025/3/23
  • 回顾Python基础语法,辨析和C++等的不同~
  • vulkanscenegraph显示倾斜模型(5.4)-相机操纵器
  • MCP(Model Context Protocol)好比大模型外挂!
  • 蓝桥杯C++基础算法-0-1背包
  • WEB PKI目前的问题
  • kotlin知识体系(三) : Android Kotlin 中的函数式编程实践指南
  • Docker学习笔记(十一)宿主机无法链接宿主机问题处理
  • 购车补贴、“谷子”消费、特色产品,这些活动亮相五五购物节
  • 上海科创再出发:“造星”的城和“摘星”的人
  • 南京106亿元成交19宗涉宅地块:建邺区地块楼面单价重回4.5万元
  • 国台办:“台独”是绝路,外人靠不住
  • 违规行为屡禁不止、责任边界模糊不清,法治日报:洞穴探险,谁为安全事故买单?
  • AI观察|算力饥渴与泡沫