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
是一个枚举类型,其中的 INSTANCE1
和 INSTANCE2
是两个实例对象。
总结
单例模式和多例模式是常见的设计模式,能够提供全局唯一或指定数量的实例对象。通过使用私有构造函数和静态方法,可以实现单例模式。在多例模式中,可以通过限制