博客
关于我
23设计模式-单例模式(创建型模式)
阅读量:311 次
发布时间:2019-03-01

本文共 1104 字,大约阅读时间需要 3 分钟。

单例模式

单例模式是一种设计模式,旨在确保一个类在整个应用中只存在一个实例。这种模式通过控制实例化过程,防止多个对象的创建,节省内存资源并提高性能。单例模式的核心思想是确保类中只存在一个对象实例,并通过私有化构造方法和静态方法供外部获取。

单例模式的实现方式

单例模式有多种实现方式,常见的有以下几种:

1. 饿汉式(静态常量)

这种实现方式通过在类装载时就创建实例,并将实例存储在一个静态常量中。这种方式在类装载时就完成实例化,避免了线程同步问题,但在类转载时可能造成内存浪费。

2. 饿汉式(静态代码块)

与静态常量实现方式类似,但将实例化过程放在静态代码块中。这种方式在类装载时执行静态代码块,初始化实例。优缺点与静态常量方式相同。

3. 懒汉式(线程不安全)

这种方式通过检查实例是否为 null 来控制实例化。虽然在单线程情况下能够保证实例唯一性,但在多线程环境下可能导致线程安全问题,多个线程可能同时创建实例。

4. 懒汉式(线程安全)

为了解决线程不安全的问题,这种方式使用同步方法修饰实例化操作。虽然保证了线程安全,但由于同步方法的开销较大,可能导致程序效率低下。

5. 懒汉式(同步代码块,线程不安全)

这种方式尝试通过在实例化前加锁来解决线程不安全问题,但由于判断条件和实例化操作都没有加锁,仍然存在多个线程创建实例的风险。

6. 懒汉式(双重检查)

这种方式通过在双重 null 检查中加入锁,确保在多线程环境下也能正确创建实例。这种方式线程安全且效率较高。

7. 懒汉式(静态内部类)

这种方式利用静态内部类的特性,延迟实例化。静态内部类在外部类装载时不会立即加载,直到外部类需要访问方法时才进行实例化。这种方式避免了线程不安全并提高了效率。

8. 懒汉式(枚举类)

这种方式利用枚举类特性,确保单例模式的唯一性,同时避免了反序列化创建新实例的风险。

JDK中的单例模式应用

Java标准库中的 java.lang.Runtime 类使用单例模式,通过一个静态常量存储唯一的实例。这正是饿汉式(静态常量)实现方式的典型应用。

单例模式注意事项

  • 单例类的设计原则:确保类只允许有一个实例,通常通过私有化构造方法和静态获取方法实现。
  • 避免资源泄漏:确保在不需要时及时释放资源,避免内存泄漏。
  • 线程安全:确保在多线程环境下也能正确创建和获取实例。
  • 延迟加载:在第一次访问时进行实例化,减少资源占用。
  • 适用场景:适用于需要频繁创建和销毁的对象,尤其是资源占用较高的对象,如数据库连接池、文件处理工具类等。
  • 单例模式通过控制对象实例的数量,提升了系统性能和资源利用率,是一个非常有用的设计模式。

    你可能感兴趣的文章
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>
    Python听写汇总结果
    查看>>