class::new配合工厂模式将switch-case创建逻辑转为配置驱动的类映射,通过约定命名(如"csv"→csvprocessor)和const_get动态实例化,实现零分支、易扩展、可测试的对象创建。

用 Class::new 配合工厂模式,可以把原本散落在 switch-case 里的对象创建逻辑,收束成可扩展、易测试、无分支的类映射关系。核心不是“不用 if/else”,而是让类型选择这件事,从运行时条件判断,变成配置驱动的类名查找与实例化。
把 case 分支转成类名映射表
传统 switch-case 创建不同处理器,本质是在做「字符串 → 类型」的路由。工厂模式直接把这个映射显式写出来,不再靠一堆 case 去匹配:
- 定义统一接口(比如
Processor),所有具体类都继承/实现它 - 约定类命名规则,如
"csv"→CsvProcessor,"json"→JsonProcessor - 用哈希表或常量哈希预先注册映射,或用规范命名 + 动态常量查找
用 Class::new 实现零配置动态实例化
Ruby 的 Class::new 允许在运行时构造匿名类,但更常用的是结合 const_get 和 new 完成「字符串→类→实例」三步合一:
def processor_for(format)
klass = Object.const_get("#{format.capitalize}Processor")
klass.new
rescue NameError
raise UnsupportedFormatError, "no processor for #{format}"
end
这样,新增一种格式只需加一个类文件(如 xml_processor.rb),无需改任何分支逻辑。没有 case,也没有 if,只有约定和加载。
动态切换AI模型以优化成本与性能。当用户发出“eco mode”、“balanced mode”、“smart mode”或“max mode”等模式指令,或使用“/modes status”查询状态及“/modes setup”配置模式时触发。
带参数的工厂:用 lambda 或 builder 模式兜底
如果不同处理器需要不同初始化参数(比如有的要传 encoding,有的要传 schema),别把参数塞进 case 里判断。改用 builder 或闭包封装构造逻辑:
- 在映射表中存 lambda:
{ csv: -> { CsvProcessor.new(delimiter: ",") } } - 或统一接收 options hash,由各 Processor#initialize 自行提取所需字段
- 避免工厂方法变胖——它只负责 new,不负责决策参数值
测试友好:替换类、打桩、验证调用链
消灭 switch-case 后,单元测试变得轻量直接:
- 测试工厂方法,只需 mock
Object.const_get返回 stub 类,断言是否调用了new - 每个 Processor 类可独立测试,无需模拟整个 case 流程
- 新增格式时,只写一个新类 + 一个对应测试,不碰原有代码
不复杂但容易忽略。










