📜  Java单例设计模式实践与示例(1)

📅  最后修改于: 2023-12-03 15:32:02.754000             🧑  作者: Mango

Java单例设计模式实践与示例

什么是单例模式?

单例模式是一种创建型设计模式,用于确保仅创建一个实例的类,并提供对该实例的全局访问点。

在Java中,单例模式是一种常见的设计模式,常常用于确保只有一个实例对象,并为其他对象提供访问该对象的通用接口。

单例模式的优点

使用单例模式可以解决以下问题:

  • 省略了创建和销毁对象的开销
  • 避免了对象过多占用内存空间的问题
  • 提供了对全局对象的控制访问点
单例模式的实现方式
饿汉式单例

在饿汉式单例中,对象在类加载时就被创建。

public class Singleton {
    // 饿汉式单例,线程安全
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}
懒汉式单例

在懒汉式单例中,对象在第一次被访问时才被创建,也称为惰性实例化。

public class Singleton {
    // 懒汉式单例,非线程安全
    private static Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
双重检验锁 DCL

双重检验锁(Double-Checked Lock,简称DCL)模式是一种更安全的单例模式,它的特点是在getInstance()方法中,先检查是否已经实例化,如果没有实例化才进入同步代码块,防止多个线程同时创建实例。

public class Singleton {
    // 双重检验锁DCL,线程安全
    private static volatile Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
单例模式的使用场景

单例模式常常用于以下场景:

  • 数据库连接池
  • 配置管理器
  • 日志记录器
  • 线程池
  • 等等

由于单例模式可以提供全局单一实例的访问点,因此其他需要访问这些对象的类可以直接引用该单例,而无需每次新建一个实例。

总结

单例模式是一个简单而有用的设计模式,它可以提供全局访问点,并确保只有一个实例对象。在Java中,可以使用饿汉式单例、懒汉式单例或双重检验锁DCL等方式来实现单例模式。虽然单例模式有一些争议,但它依然是一个非常实用的设计模式,可以在许多情况下为我们节省时间和资源。