多例模式(Multiton Pattern):互联网应用配置管理实战案例分析

肖哥弹架构 跟大家"弹弹" 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

在一个高可用的互联网应用中,常常需要根据不同的配置组来创建多个具有特定配置的实例,例如数据库连接池、缓存实例等。这些实例的数量是已知的,并且在应用启动时就需要确定。

2. 为什么要使用多例设计模式

多例模式允许系统在全局范围内维护一个有限数量的对象实例集合,每个实例对应不同的配置或资源。

3. 标准多例设计模式图

4. 业务多例设计模式图

5. 业务代码参考

java 复制代码
// 配置管理器
class ConfigManager {
    private static Map<String, ConfigManager> instances = new ConcurrentHashMap<>();
    private DatabaseConfig databaseConfig;

    private ConfigManager(DatabaseConfig config) {
        this.databaseConfig = config;
    }

    public static ConfigManager getInstance(String configKey) {
        if (!instances.containsKey(configKey)) {
            synchronized (ConfigManager.class) {
                if (!instances.containsKey(configKey)) {
                    // 根据配置键创建新的配置管理器实例
                    DatabaseConfig config = DatabaseConfigFactory.getDatabaseConfig(configKey);
                    instances.put(configKey, new ConfigManager(config));
                }
            }
        }
        return instances.get(configKey);
    }

    public String getUrl() {
        return databaseConfig.getUrl();
    }

    public String getUser() {
        return databaseConfig.getUser();
    }

    public String getPassword() {
        return databaseConfig.getPassword();
    }
}

// 数据库配置
class DatabaseConfig {
    private String url;
    private String user;
    private String password;

    public DatabaseConfig(String url, String user, String password) {
        this.url = url;
        this.user = user;
        this.password = password;
    }

    public String getUrl() {
        return url;
    }

    public String getUser() {
        return user;
    }

    public String getPassword() {
        return password;
    }
}

// 数据库配置工厂(简化示例,实际项目中可能根据配置文件或环境变量构建)
class DatabaseConfigFactory {
    public static DatabaseConfig getDatabaseConfig(String key) {
        // 根据key获取不同的数据库配置
        switch (key) {
            case "config1":
                return new DatabaseConfig("jdbc:mysql://db1", "user1", "password1");
            case "config2":
                return new DatabaseConfig("jdbc:mysql://db2", "user2", "password2");
            default:
                throw new IllegalArgumentException("Unknown config key: " + key);
        }
    }
}

// 客户端使用
class InternetApplication {
    public static void main(String[] args) {
        ConfigManager configManager1 = ConfigManager.getInstance("config1");
        ConfigManager configManager2 = ConfigManager.getInstance("config2");

        System.out.println("Database 1 URL: " + configManager1.getUrl());
        System.out.println("Database 2 URL: " + configManager2.getUrl());
    }
}

6. 使用多例计模式的好处

  • 全局配置管理:确保不同部分的系统使用统一的配置。
  • 资源优化:避免创建过多实例,节省资源。

7. 其他使用多例设计模式场景参考

  • 线程池管理:根据不同的业务需求创建不同大小的线程池。
  • 缓存管理:根据不同的数据类型使用不同的缓存策略。

8. 可参考开源框架

  • Spring Framework :在Spring中,可以使用@Configurable注解来注入不同环境的配置。

总结

多例模式是一种有用的设计模式,它允许系统根据不同的键值来维护多个实例,适用于需要根据不同配置创建不同实例的场景。

历史热点文章

相关推荐
callJJ41 分钟前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
珍宝商店1 小时前
前端老旧项目全面性能优化指南与面试攻略
前端·面试·性能优化
bitbitDown1 小时前
四年前端分享给你的高效开发工具库
前端·javascript·vue.js
gnip2 小时前
实现AI对话光标跟随效果
前端·javascript
你的人类朋友3 小时前
JWT的组成
后端
脑花儿3 小时前
ABAP SMW0下载Excel模板并填充&&剪切板方式粘贴
java·前端·数据库
北风朝向4 小时前
Spring Boot参数校验8大坑与生产级避坑指南
java·spring boot·后端·spring
canonical_entropy4 小时前
一份关于“可逆计算”的认知解码:从技术细节到哲学思辨的完整指南
后端·低代码·deepseek
lumi.4 小时前
Vue.js 从入门到实践1:环境搭建、数据绑定与条件渲染
前端·javascript·vue.js
二十雨辰4 小时前
vue核心原理实现
前端·javascript·vue.js