设计模式--单例模式

一、单例模式代码实现

java 复制代码
public class DatabaseConnection {
    // 1. 私有静态实例变量
    private static DatabaseConnection instance;

    // 2. 私有构造函数,防止外部直接创建实例
    private DatabaseConnection() {
        // 初始化数据库连接
        System.out.println("Database connection initialized.");
    }

    // 3. 公共静态方法,提供全局访问点
    public static DatabaseConnection getInstance() {
        if (instance == null) {
            // 双重检查锁定,确保线程安全
            synchronized (DatabaseConnection.class) {
                if (instance == null) {
                    instance = new DatabaseConnection();
                }
            }
        }
        return instance;
    }

    // 4. 示例方法,模拟数据库操作
    public void executeQuery(String query) {
        System.out.println("Executing query: " + query);
    }
}

二、日志管理器

场景描述

在一个大型系统中,日志记录是必不可少的。为了避免重复创建日志对象,我们可以使用单例模式来设计一个 日志管理器,统一管理日志的写入和输出。

代码实现

java 复制代码
import java.io.FileWriter;
import java.io.IOException;

public class Logger {
    // 1. 私有静态实例变量
    private static Logger instance;
    private FileWriter writer;

    // 2. 私有构造函数,防止外部直接创建实例
    private Logger() {
        try {
            // 初始化日志文件
            writer = new FileWriter("app.log", true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 3. 公共静态方法,提供全局访问点
    public static synchronized Logger getInstance() {
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }

    // 4. 日志记录方法
    public void log(String message) {
        try {
            writer.write(message + "\n");
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 5. 关闭日志文件
    public void close() {
        try {
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用场景

java 复制代码
public class Application {
    public static void main(String[] args) {
        // 获取日志管理器的单例实例
        Logger logger = Logger.getInstance();

        // 记录日志
        logger.log("Application started.");
        logger.log("User logged in: John Doe");

        // 关闭日志文件
        logger.close();
    }
}

会在代码里直接生成一个app.log文件

三、配置管理器

场景描述

在项目中,通常需要读取配置文件(如 config.properties)。为了避免重复加载配置文件,我们可以使用单例模式来设计一个 配置管理器,统一管理配置的读取和访问。

代码实现

java 复制代码
import java.util.Properties;
import java.io.FileInputStream;
import java.io.IOException;

public class ConfigurationManager {
    // 1. 私有静态实例变量
    private static ConfigurationManager instance;
    private Properties properties;

    // 2. 私有构造函数,防止外部直接创建实例
    private ConfigurationManager() {
        properties = new Properties();
        try {
            // 加载配置文件
            properties.load(new FileInputStream("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 3. 公共静态方法,提供全局访问点
    public static synchronized ConfigurationManager getInstance() {
        if (instance == null) {
            instance = new ConfigurationManager();
        }
        return instance;
    }

    // 4. 获取配置项
    public String getProperty(String key) {
        return properties.getProperty(key);
    }
}

使用场景

java 复制代码
public class Application {
    public static void main(String[] args) {
        // 获取配置管理器的单例实例
        ConfigurationManager configManager = ConfigurationManager.getInstance();

        // 读取配置项
        String dbUrl = configManager.getProperty("database.url");
        String dbUser = configManager.getProperty("database.user");

        System.out.println("Database URL: " + dbUrl);
        System.out.println("Database User: " + dbUser);
    }
}

四、线程池管理器(ThreadPool Manager)

场景描述

在多线程应用中,线程池是管理线程资源的常用方式。为了避免重复创建线程池,我们可以使用单例模式来设计一个 线程池管理器,统一管理线程池的创建和任务分配。

代码实现

java 复制代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolManager {
    // 1. 私有静态实例变量
    private static ThreadPoolManager instance;
    private ExecutorService threadPool;

    // 2. 私有构造函数,防止外部直接创建实例
    private ThreadPoolManager() {
        // 初始化线程池(固定大小为 10)
        threadPool = Executors.newFixedThreadPool(10);
    }

    // 3. 公共静态方法,提供全局访问点
    public static synchronized ThreadPoolManager getInstance() {
        if (instance == null) {
            instance = new ThreadPoolManager();
        }
        return instance;
    }

    // 4. 提交任务到线程池
    public void submitTask(Runnable task) {
        threadPool.submit(task);
    }

    // 5. 关闭线程池
    public void shutdown() {
        threadPool.shutdown();
    }
}

使用场景

java 复制代码
public class Application {
    public static void main(String[] args) {
        // 获取线程池管理器的单例实例
        ThreadPoolManager threadPoolManager = ThreadPoolManager.getInstance();

        // 提交任务到线程池
        for (int i = 0; i < 20; i++) {
            threadPoolManager.submitTask(() -> {
                System.out.println("Task executed by " + Thread.currentThread().getName());
            });
        }

        // 关闭线程池
        threadPoolManager.shutdown();
    }
}

五、数据库连接池

场景描述

在高并发应用中,数据库连接池是管理数据库连接资源的常用方式。为了避免重复创建连接池,我们可以使用单例模式来设计一个 数据库连接池管理器,统一管理连接的获取和释放。

代码实现

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DatabaseConnectionPool {
    // 1. 私有静态实例变量
    private static DatabaseConnectionPool instance;
    private List<Connection> connectionPool;
    private static final int POOL_SIZE = 10;

    // 2. 私有构造函数,防止外部直接创建实例
    private DatabaseConnectionPool() {
        connectionPool = new ArrayList<>();
        try {
            for (int i = 0; i < POOL_SIZE; i++) {
                Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
                connectionPool.add(connection);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 3. 公共静态方法,提供全局访问点
    public static synchronized DatabaseConnectionPool getInstance() {
        if (instance == null) {
            instance = new DatabaseConnectionPool();
        }
        return instance;
    }

    // 4. 获取数据库连接
    public synchronized Connection getConnection() {
        if (connectionPool.isEmpty()) {
            throw new RuntimeException("No available connections in the pool.");
        }
        return connectionPool.remove(0);
    }

    // 5. 释放数据库连接
    public synchronized void releaseConnection(Connection connection) {
        connectionPool.add(connection);
    }
}

使用场景

java 复制代码
public class Application {
    public static void main(String[] args) {
        // 获取数据库连接池的单例实例
        DatabaseConnectionPool connectionPool = DatabaseConnectionPool.getInstance();

        // 获取连接
        Connection connection = connectionPool.getConnection();

        // 执行数据库操作
        try {
            // 模拟数据库操作
            System.out.println("Executing query...");
        } finally {
            // 释放连接
            connectionPool.releaseConnection(connection);
        }
    }
}

单例模式的核心思想是 确保一个类只有一个实例,并提供全局访问点,从而避免资源浪费和提高性能。

相关推荐
五行星辰8 分钟前
Java链接redis
java·开发语言·redis
编程毕设8 分钟前
【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
java·微信小程序·小程序
异常驯兽师11 分钟前
Java集合框架深度解析:List、Set与Map的核心区别与应用指南
java·开发语言·list
A boy CDEF girl33 分钟前
【JavaEE】定时器
java·java-ee
xiaozaq1 小时前
Spring Boot静态资源访问顺序
java·spring boot·后端
嗨起飞了2 小时前
Maven快速入门指南
java·maven
A boy CDEF girl2 小时前
【JavaEE】线程池
java·java-ee
Joeysoda2 小时前
JavaEE进阶(2) Spring Web MVC: Session 和 Cookie
java·前端·网络·spring·java-ee
Y雨何时停T2 小时前
深入理解 Java 虚拟机之垃圾收集
java·开发语言
动亦定3 小时前
物联网设备接入系统后如何查看硬件实时数据?
java·物联网