变量工厂方法通过抽象工厂接口与具体环境工厂实现解耦,使数据库地址、日志级别等配置按需动态生成,支持开发、测试、生产等多环境无缝切换,新增环境只需扩展工厂类而无需修改原有逻辑。

变量的工厂方法不是直接“生成变量”,而是通过封装创建逻辑,让不同环境(如开发、测试、生产)能按需产出符合该环境特征的配置值或对象实例。核心是把“值怎么来”从硬编码中解耦出来,交给策略决定。
明确变量工厂要解决什么问题
很多项目里,数据库地址、日志级别、API超时时间等初始值写死在代码或配置文件里,导致:
- 切换环境要手动改配置,容易出错
- 测试时想临时覆盖某个值,得改多处甚至重编译
- 新增环境(比如灰度环境)需要侵入式修改已有初始化逻辑
用抽象工厂 + 具体环境工厂构建变量供给体系
不直接 new 字符串或数字,而是定义一个“变量提供者”接口,再为每个环境实现它:
- 抽象工厂:声明 getDatabaseUrl()、getLogLevel() 等方法,返回抽象类型(如 String、int、LogLevel 枚举)
- DevEnvironmentFactory:返回 localhost:5432、DEBUG、3000ms
- ProdEnvironmentFactory:返回 cluster-db-prod:5432、WARN、1500ms
- 业务模块(如 ConfigLoader)只依赖抽象工厂,运行时注入对应环境的具体工厂
配合配置中心或启动参数动态选择工厂
避免在代码里写 if (env == "prod") new ProdFactory() —— 这又成了硬编码。推荐方式:
- 读取系统属性 -Dapp.env=prod,用工厂映射表自动加载 ProdEnvironmentFactory
- Spring Boot 中通过 @Profile("prod") 注解激活对应配置类
- K8s 环境下用 Downward API 注入 ENV 变量,由初始化器加载对应工厂
扩展性体现在新增环境无需改老代码
比如加一个“本地模拟环境”用于离线调试:
- 只需新增 LocalMockFactory,实现所有 getXXX 方法返回模拟值(如内存数据库 URL、固定 token)
- 注册到工厂路由表(如 Map
),不碰原有 Dev/Prod 逻辑 - 启动时传 -Dapp.env=mock,系统自动选用新工厂
这种模式本质是把“变量值的来源”当成一种可插拔能力,而不是静态数据。它不增加运行时开销,却显著提升多环境协同和配置治理的可靠性。










