Java 单例和多例

在软件开发中,设计模式是解决常见问题的可复用方案。其中,单例模式和多例模式是两个常见且重要的设计模式。本文将详细介绍 Java 中的单例和多例模式,包括概念解释和代码示例。

单例模式

单例模式是一种创建型设计模式,它确保类只有一个实例,并提供全局访问点。在 Java 中,实现单例模式的常用方法是使用私有构造函数和静态方法。

实现方式一:饿汉式

饿汉式是一种最简单的单例实现方式。它在类加载时就创建了实例对象,因此被称为“饿汉式”。

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
        // 私有构造函数
    }

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

在上述代码中,私有构造函数 Singleton() 确保其他类无法直接实例化 Singleton 类。通过静态方法 getInstance() 返回唯一的实例对象 instance

实现方式二:懒汉式

懒汉式是一种在需要时才创建实例的单例实现方式。它在首次调用 getInstance() 方法时才创建实例对象。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数
    }

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

在上述代码中,getInstance() 方法首先检查实例变量 instance 是否为空,如果为空则创建新的实例对象。

实现方式三:双重检查锁定

双重检查锁定是一种在多线程环境下高效创建实例的单例实现方式。它首先检查实例是否已经创建,如果没有则进行同步并创建实例。

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // 私有构造函数
    }

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

在上述代码中,volatile 关键字确保多线程环境下的可见性。在同步块内部,再次检查实例是否为空,以避免并发创建多个实例的问题。

多例模式

多例模式是一种创建指定数量实例的设计模式。在 Java 中,可以通过限制实例数量和使用枚举类型来实现多例模式。

实现方式一:限制实例数量

通过限制实例数量,可以实现多例模式。以下示例限制实例数量为两个。

public class Multiton {
    private static final Multiton INSTANCE1 = new Multiton();
    private static final Multiton INSTANCE2 = new Multiton();

    private Multiton() {
        // 私有构造函数
    }

    public static Multiton getInstance(int index) {
        if (index == 1) {
            return INSTANCE1;
        } else if (index == 2) {
            return INSTANCE2;
        } else {
            throw new IllegalArgumentException("Invalid index");
        }
    }
}

在上述代码中,通过私有构造函数确保其他类无法直接实例化 Multiton 类。通过静态方法 getInstance(int index) 返回指定索引的实例对象。

实现方式二:使用枚举类型

利用 Java 的枚举类型,可以更简洁地实现多例模式。以下示例实现了两个实例。

public enum Multiton {
    INSTANCE1,
    INSTANCE2
}

在上述代码中,Multiton 是一个枚举类型,其中的 INSTANCE1INSTANCE2 是两个实例对象。

总结

单例模式和多例模式是常见的设计模式,能够提供全局唯一或指定数量的实例对象。通过使用私有构造函数和静态方法,可以实现单例模式。在多例模式中,可以通过限制