Java单例模式和多例模式的使用方案

在Java开发中,单例模式和多例模式是常见的设计模式,分别用于确保类只有一个实例和预定义数量的实例。本文将详细讨论这两种模式,并通过具体的代码示例和ER图、类图帮助大家更好地理解它们。

一、单例模式

1.1 定义

单例模式确保一个类只有一个实例,并提供全局访问点。通常用于需要控制资源(如线程池、数据库连接等)的场景。

1.2 实现方式

在Java中,单例模式有多种实现方式,最常见的包括懒汉式和饿汉式。

1.2.1 饿汉式
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
1.2.2 懒汉式
public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}

    public static LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}
1.2.3 线程安全的懒汉式
public class ThreadSafeLazySingleton {
    private static ThreadSafeLazySingleton instance;

    private ThreadSafeLazySingleton() {}

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

1.3 使用场景

在需要全局共享某个对象的时候,比如数据库连接池或配置类,使用单例模式是最合适的选择。

二、多例模式

2.1 定义

多例模式允许一个类有多个实例,每个实例可以通过特定的方式进行访问。多例模式的实例数量是有限的,通常在类内部定义一个固定的实例列表。

2.2 实现方式

以下是一个简单的多例模式实现,其中确保最多只有三个实例可以创建。

import java.util.ArrayList;
import java.util.List;

public class MultiInstance {
    private static final int MAX_INSTANCES = 3;
    private static final List<MultiInstance> instances = new ArrayList<>();
    
    private MultiInstance() {
        // Private constructor
    }

    public static MultiInstance createInstance() {
        if (instances.size() < MAX_INSTANCES) {
            MultiInstance instance = new MultiInstance();
            instances.add(instance);
            return instance;
        } else {
            throw new RuntimeException("Cannot create more than " + MAX_INSTANCES + " instances");
        }
    }

    public static List<MultiInstance> getInstances() {
        return instances;
    }
}

2.3 使用场景

多例模式适用于需要限制实例数量的场景,如线程池、特定控制设备的管理类等。

三、关系图

在使用单例模式和多例模式时,可以采用ER图来表示不同类别的对象关系。以下是一个简单的ER图:

erDiagram
    SINGLETON {
        string id
        string value
    }
    MULTIINSTANCE {
        string id
        string value
    }
    SINGLETON ||--o{ MULTIINSTANCE : contains

四、类图

类图用于展示系统中类的结构与关系,以下是单例模式和多例模式的类图:

classDiagram
    class Singleton {
        +static Singleton getInstance() 
    }
    
    class LazySingleton {
        +static LazySingleton getInstance() 
    }
    
    class ThreadSafeLazySingleton {
        +static ThreadSafeLazySingleton getInstance() 
    }
    
    class MultiInstance {
        +static MultiInstance createInstance() 
        +static List<MultiInstance> getInstances() 
    }

    Singleton <|-- LazySingleton
    Singleton <|-- ThreadSafeLazySingleton
    MultiInstance <|-- MAX_INSTANCES

五、总结

在Java编程中,单例模式和多例模式是重要的设计模式。单例模式通过控制实例数量确保资源的合理使用,而多例模式则适合需要限量实例的场景。合理地使用这两种模式可以提高代码的可维护性与扩展性。

通过本文的代码示例、ER图和类图,读者可以对这两种模式有更深入的理解与应用。希望大家在实际开发中能够结合项目需求,灵活运用单例和多例设计模式,提升代码的质量与效率。