多例模式(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注解来注入不同环境的配置。

总结

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

历史热点文章

相关推荐
Cachel wood11 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
学代码的小前端12 分钟前
0基础学前端-----CSS DAY9
前端·css
gb421528716 分钟前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
joan_8516 分钟前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
程序猿进阶17 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
m0_748236111 小时前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
颜淡慕潇1 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_748248941 小时前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5