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

总结

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

历史热点文章

相关推荐
学长毕设14 分钟前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
她说可以呀1 小时前
Vue插槽
前端·javascript·vue.js
qq_448011161 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan2 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352902 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
2分钟速写快排2 小时前
ggg! 潜行摸鱼被 Trae 爆改成 3D!
人工智能·程序员·数据可视化
努力的小雨2 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
志尊宝3 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
深蓝AI4 小时前
EMBRACE 攻击打穿五个 AI 编程工具的浏览器:本地开发机成了最大攻击面
人工智能·程序员
FRing034 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript