肖哥弹架构 跟大家"弹弹" 业务中设计模式的使用,需要代码关注
欢迎 点赞,点赞,点赞。
关注公号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
注解来注入不同环境的配置。
总结
多例模式是一种有用的设计模式,它允许系统根据不同的键值来维护多个实例,适用于需要根据不同配置创建不同实例的场景。
历史热点文章
- 委托模式(Delegation Pattern):多渠道消息发送服务实战案例分析
- 外观模式(Facade Pattern):微服务架构中的数据库访问实战案例分析
- 代理模式(Proxy Pattern):权限校验API调用实战案例分析
- 桥接模式(Bridge Pattern):多样式用户界面组件实战案例分析
- 组合模式(Composite Pattern): 在线教育平台课程管理实战案例分析
- 享元模式(Flyweight Pattern):网页游戏中的角色对象管理实战案例分析
- 观察者模式(Observer Pattern):股票交易系统实战案例分析
- 策略模式(Strategy Pattern):电商平台的优惠券系统实战案例分析
- 模板方法模式(Template Method Pattern):视频播放应用实战案例分析
- 命令模式(Command Pattern):网络爬虫任务队列实战案例分析
- 迭代器模式(Iterator Pattern):电商平台商品分类浏览实战案例分析
- 中介者模式(Mediator Pattern):即时通讯软件实战案例分析
- 备忘录模式(Memento Pattern):游戏存档系统实战案例分析
- 状态模式(State Pattern):电商平台订单状态管理实战案例分析
- 责任链模式(Chain of Responsibility Pattern):电商平台的订单审批流程实战案例分析
- 访问者模式(Visitor Pattern):电商平台商品访问统计实战案例分析
- 工厂方法模式(Factory Method Pattern): 电商多种支付实战案例分析
- 抽象工厂模式(Abstract Factory Pattern):多风格桌面应用实战案例分析
- 建造者模式(Builder Pattern): 在线订单系统实战案例分析
- 原型模式(Prototype Pattern): 云服务环境配置实战案例分析
- 适配器模式(Adapter Pattern):第三方支付集成实战案例分析
- 装饰器模式(Decorator Pattern):电商平台商品价格策略实战案例分析
- 单例模式(Singleton Pattern):购物车实战案例分析