编程技术分享平台

网站首页 > 技术教程 正文

常用设计模式之单例模式应用场景示例代码

xnh888 2025-01-05 20:43:13 技术教程 40 ℃ 0 评论

程序员在开发中经常会遇到单例模式,无论是使用开源的代码还是自己需要在业务场景中使用,这都是需要掌握的必备知识。 今天这篇文章来全面讲解下单例模式。 单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。以下是一些常见的应用场景以及相应的示例代码:

1. 数据库连接池

在应用程序中,数据库连接是一个昂贵的资源,频繁地创建和销毁连接会影响性能。使用单例模式可以创建一个数据库连接池,确保整个应用程序共享同一个连接池实例。

Java 示例代码:

public class DatabaseConnectionPool {
    private static DatabaseConnectionPool instance;
    private List<Connection> connectionPool;

    private DatabaseConnectionPool() {
        // 初始化连接池
        connectionPool = new ArrayList<>();
        // 假设我们初始化了5个连接
        for (int i = 0; i < 5; i++) {
            connectionPool.add(createNewConnection());
        }
    }

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

    private Connection createNewConnection() {
        // 创建新的数据库连接
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
    }

    public Connection getConnection() {
        if (connectionPool.isEmpty()) {
            return createNewConnection();
        } else {
            return connectionPool.remove(connectionPool.size() - 1);
        }
    }

    public void releaseConnection(Connection connection) {
        connectionPool.add(connection);
    }
}

2. 配置管理器

在应用程序中,配置信息通常需要被多个模块共享。使用单例模式可以创建一个配置管理器,确保所有模块都使用相同的配置实例。

Python 示例代码:

class ConfigurationManager:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(ConfigurationManager, cls).__new__(cls)
            cls._instance.config = {}
        return cls._instance

    def set_config(self, key, value):
        self.config[key] = value

    def get_config(self, key):
        return self.config.get(key)

# 使用示例
config_manager = ConfigurationManager()
config_manager.set_config('api_url', 'https://api.example.com')
print(config_manager.get_config('api_url'))

3. 日志记录器

在应用程序中,日志记录是一个常见的需求。使用单例模式可以创建一个日志记录器,确保所有模块都使用相同的日志记录实例。

C++ 示例代码:

#include <iostream>
#include <fstream>
#include <string>
#include <mutex>

class Logger {
private:
    static Logger* instance;
    static std::mutex mutex;
    std::ofstream logFile;

    // 私有构造函数
    Logger() {
        logFile.open("app.log", std::ios::app);
    }

public:
    // 禁止拷贝构造和赋值操作
    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;

    static Logger* getInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance == nullptr) {
            instance = new Logger();
        }
        return instance;
    }

    void log(const std::string& message) {
        logFile << message << std::endl;
    }
};

// 初始化静态成员变量
Logger* Logger::instance = nullptr;
std::mutex Logger::mutex;

// 使用示例
int main() {
    Logger* logger = Logger::getInstance();
    logger->log("This is a log message.");
    return 0;
}

4. 缓存管理器

在应用程序中,缓存是一种常见的优化手段。使用单例模式可以创建一个缓存管理器,确保所有模块都使用相同的缓存实例。

JavaScript 示例代码:

class CacheManager {
    constructor() {
        if (!CacheManager.instance) {
            this.cache = new Map();
            CacheManager.instance = this;
        }
        return CacheManager.instance;
    }

    set(key, value) {
        this.cache.set(key, value);
    }

    get(key) {
        return this.cache.get(key);
    }
}

const cacheManager = new CacheManager();
Object.freeze(cacheManager); // 确保实例不可修改

// 使用示例
cacheManager.set('user', { name: 'John Doe' });
console.log(cacheManager.get('user')); // 输出: { name: 'John Doe' }

这些示例展示了单例模式在不同编程语言中的实现方式及其应用场景。通过使用单例模式,可以确保某些关键组件在整个应用程序中只有一个实例,从而节省资源并提高性能。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表