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

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

单例模式

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

单例模式的实现方式

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

1. 饿汉式(静态常量)

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

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

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

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

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

4. 懒汉式(线程安全)

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

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

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

6. 懒汉式(双重检查)

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

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

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

8. 懒汉式(枚举类)

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

JDK中的单例模式应用

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

单例模式注意事项

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

    你可能感兴趣的文章
    python中什么是实例方法_在Python中创建实例方法对象的不同方法
    查看>>
    Python中使用cutecharts实现简单的手绘风格的图表
    查看>>
    python中使用dxfgrabber,解析dxf文件信息生成obj文件
    查看>>
    Python中使用ncmbot玩转网易云音乐
    查看>>
    Python中使用PIL快速实现二值图
    查看>>
    Python中使用PIL快速实现灰度图
    查看>>
    Python中使用pip install ncmbot时各种错误解决办法
    查看>>
    Python中使用requests和parsel爬取喜马拉雅电台音频
    查看>>
    Python中使用turtle绘制多个同心圆
    查看>>
    Python中使用turtle绘制棋盘详解
    查看>>
    Python中使用wordcloud生成漂亮的中文词云
    查看>>
    Python中使用wxpy定时机器人给微信好友发送每日一文
    查看>>
    Python中使用zip()并行迭代
    查看>>
    Python中使用推导式创建序列
    查看>>
    Python中信号处理程序和atexit处理程序的调用
    查看>>
    Python中关于txt的简单读写模式与操作
    查看>>
    Python中关于类和函数的初体验之"__init__"和"__str__"不是"_init_"和"_str_"
    查看>>
    python中函数接受参数为*args, **kwargs怎么办
    查看>>
    Python中切片的高效迭代
    查看>>
    python中列表乘法、eval、lambda、hasattr、assert、*(星)等的用法
    查看>>