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

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

单例模式

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

单例模式的实现方式

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

1. 饿汉式(静态常量)

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

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

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

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

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

4. 懒汉式(线程安全)

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

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

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

6. 懒汉式(双重检查)

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

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

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

8. 懒汉式(枚举类)

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

JDK中的单例模式应用

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

单例模式注意事项

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

    你可能感兴趣的文章
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>
    Openlayers实战:判断共享单车是否在电子围栏内
    查看>>
    Openlayers实战:加载Bing地图
    查看>>
    Openlayers实战:绘制图形,导出geojson文件
    查看>>
    Openlayers实战:绘制图形,导出KML文件
    查看>>
    Openlayers实战:绘制多边形,导出CSV文件
    查看>>
    Openlayers实战:绘制带箭头的线
    查看>>
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers实战:非4326,3857的投影
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>