返回

用设计模式玩转单例,让程序更优雅

前端

玩转设计模式(单例模式)

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」。

序言

单例模式在实际工作中的应用场景非常多,概念非常简单,就是整个程序中,有且只允许有一个实例。例如:我们程序中存放一个全局配置对象,全局只允许有一个配置对象,那么就可以采用单例模式来实现。

单例模式的实现

单例模式的实现有很多种,最简单的一种是使用饿汉式单例,代码如下:

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

饿汉式单例在类加载的时候就创建了实例,保证了单例,但是也有缺点,就是无论是否用到这个实例,都会创建,造成了资源的浪费。

另一种实现方式是懒汉式单例,代码如下:

public class Singleton {

    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

懒汉式单例在第一次调用 getInstance 方法的时候才创建实例,避免了资源的浪费,但是存在线程安全问题,需要使用同步机制来保证线程安全。

单例模式的应用场景

单例模式的应用场景非常广泛,例如:

  • 全局配置对象
  • 数据库连接池
  • 线程池
  • 缓存

单例模式的优缺点

优点:

  • 保证了对象只有一个实例
  • 减少了对象的创建,提高了性能
  • 方便对对象进行控制和管理

缺点:

  • 饿汉式单例会造成资源浪费
  • 懒汉式单例存在线程安全问题

总结

单例模式是一种非常有用的设计模式,可以保证对象只有一个实例,减少对象的创建,提高性能。但是,在使用单例模式的时候,需要注意其优缺点,并根据实际情况选择合适的实现方式。