「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)

简介: 该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。

核心思想

  • 通过配置文件反射机制动态决定具体工厂的选择,减少客户端对具体工厂和具体产品的硬编码依赖,使系统更灵活、更易扩展。
  • 改进点:
    • 配置文件解耦:使用配置文件动态加载具体工厂类。
    • 反射机制扩展:通过反射机制创建具体工厂对象,避免客户端直接依赖具体工厂类。
    • 提升扩展性:新增产品族时无需修改客户端代码。

代码实现

1. 定义配置文件

americano=com.colin.patterns.creational_patterns.config_factory.Americano
latte=com.colin.patterns.creational_patterns.config_factory.Latte

2. 改进工厂类

package com.colin.patterns.creational_patterns.config_factory;

import java.util.HashMap;
import java.util.Properties;

public class CoffeeFactory {

    // 1.定义容器Map,存储所有的咖啡对象
    private static HashMap<String, Coffee> map = new HashMap<>();

    // 2.加载配置文件
    static {
        // 2.1.创建Properties对象
        Properties properties = new Properties();
        // 2.2.加载配置文件
        try {
            properties.load(CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties"));
            // 2.3.获取配置文件中所有的key
            for (Object key : properties.keySet()) {
                // 2.4.获取value
                String className = properties.getProperty((String) key);
                // 2.5.通过反射创建对象
                Class clazz = Class.forName(className);
                Coffee coffee = (Coffee) clazz.newInstance();
                // 2.6.把key和value存入map中
                map.put((String) key,coffee);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 根据name获取Coffee对象
    public static Coffee createCoffee(String name) {
        return map.get(name);
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Coffee americano = CoffeeFactory.createCoffee("americano");
        System.out.println(americano.getName());
        System.out.println("-----------------------------------------");
        Coffee latte = CoffeeFactory.createCoffee("latte");
        System.out.println(latte.getName());
    }
}

目录
相关文章
|
4月前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
设计模式 存储 人工智能
326 0
|
6月前
|
设计模式 C++
【实战指南】设计模式 - 工厂模式
工厂模式是一种面向对象设计模式,通过定义“工厂”来创建具体产品实例。它包含简单工厂、工厂方法和抽象工厂三种形式,分别适用于不同复杂度的场景。简单工厂便于理解但扩展性差;工厂方法符合开闭原则,适合单一类型产品创建;抽象工厂支持多类型产品创建,但不便于新增产品种类。三者各有优缺点,适用于不同设计需求。
269 59
|
7月前
|
设计模式 存储 缓存
Netty源码—9.性能优化和设计模式
本文主要介绍了Netty的两大性能优化工具、FastThreadLocal的源码和总结、Recycler的设计理念/使用/四个核心组件/初始化/对象获取/对象回收/异线程收割对象和总结,以及Netty设计模式的单例模式和策略模式。
255 53
|
8月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
8月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
248 0
|
8月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
240 0
|
8月前
|
设计模式 运维 监控
并发设计模式实战系列(4):线程池
需要建立持续的性能剖析(Profiling)和调优机制。通过以上十二个维度的系统化扩展,构建了一个从。设置合理队列容量/拒绝策略。动态扩容/优化任务处理速度。检查线程栈定位热点代码。调整最大用户进程数限制。CPU占用率100%
551 0
|
8月前
|
设计模式 消息中间件 监控
并发设计模式实战系列(3):工作队列
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第三章,废话不多说直接开始~
233 0
|
8月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
206 0