Java单例模式实现

在软件开发中,单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,有几种实现单例模式的方式,比如懒汉式、饿汉式、双重检查锁等。本文将介绍一种懒汉式单例模式的实现方式,并以一个简单的日志记录器为例进行说明。

问题描述

假设我们需要一个日志记录器类,该类只能有一个实例,并且可以被全局访问。在需要记录日志的地方,可以通过该单例对象来实现日志记录。

单例模式实现

在实现单例模式时,需要考虑线程安全性,避免多线程环境下出现多个实例的情况。以下是一个使用懒汉式单例模式实现的日志记录器类示例:

public class Logger {
    private static Logger instance;
    private List<String> logs;

    private Logger() {
        logs = new ArrayList<>();
    }

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

    public void log(String message) {
        logs.add(message);
    }

    public void printLogs() {
        for (String log : logs) {
            System.out.println(log);
        }
    }
}

在上面的代码中,Logger类使用了懒汉式单例模式实现,getInstance方法通过双重检查锁保证了线程安全。日志记录器类包含一个logs列表,用于存储日志信息,并提供了log和printLogs方法用于记录和打印日志。

类图

下面是Logger类的类图,展示了单例模式的结构:

classDiagram
    class Logger {
        - static instance: Logger
        - logs: List<String>
        + getInstance(): Logger
        + log(String message): void
        + printLogs(): void
    }

序列图

接下来,我们通过一个示例来展示如何使用Logger类进行日志记录。假设有两个线程同时记录日志:

sequenceDiagram
    participant Thread1
    participant Thread2
    participant Logger

    Thread1->Logger: getInstance()
    Logger->Thread1: Logger instance created

    Thread2->Logger: getInstance()
    Logger->Thread2: Logger instance returned

    Thread1->Logger: log("Message from Thread1")
    Thread2->Logger: log("Message from Thread2")

    Thread1->Logger: printLogs()
    Logger->Thread1: Message from Thread1
    Thread2->Logger: printLogs()
    Logger->Thread2: Message from Thread2

结论

通过上述的示例,我们展示了如何使用懒汉式单例模式实现一个日志记录器类,并通过类图和序列图展示了单例模式的结构和使用方式。单例模式可以帮助我们在需要共享资源时保证全局唯一性,并且确保线程安全性。在实际开发中,根据具体情况选择合适的单例模式实现方式,可以提高代码的可维护性和可靠性。