抽象工厂封装变量初始集的版本化创建逻辑,通过configfactory接口及v1/v2/enterprise等具体工厂实现字段、默认值、类型的差异化配置,客户端依赖工厂注入而非硬编码。

变量的抽象工厂实战,核心不是造“变量”,而是封装“变量初始集”的创建逻辑——尤其当这些初始值需按版本(如 v1.0 / v2.0 / enterprise)差异化配置时。它把“哪些值、在什么版本下生效”这一策略从客户端代码中抽离,交由工厂统一调度。
明确变量初始集的版本维度
先厘清“版本特性”具体指什么:是字段数量不同(v1只有 host/port,v2新增 timeout/retry)、默认值不同(v1 默认重试 1 次,v2 默认 3 次),还是类型结构升级(v1 用 String,v2 改用 Duration 对象)?这决定了抽象产品的粒度。
- 若仅默认值差异 → 抽象产品可定义为接口 ConfigSet,各版本工厂返回同一实现类的不同实例
- 若字段/类型变化大 → 应拆分为多个抽象产品,如 NetworkConfig、RetryPolicy、AuthConfig,再由抽象工厂统一产出配套组合
设计抽象工厂与版本化工厂
定义抽象工厂接口,每个方法对应一类可版本化的配置项:
public interface ConfigFactory {
NetworkConfig createNetworkConfig();
RetryPolicy createRetryPolicy();
AuthConfig createAuthConfig();
}
再为每个目标版本实现具体工厂:
- V1ConfigFactory:返回基于字符串、固定超时、无 token 刷新的轻量级实现
- V2ConfigFactory:返回支持 Duration、指数退避、OAuth2 流程的增强版实现
- EnterpriseConfigFactory:叠加审计开关、多租户上下文、自定义序列化器等企业级能力
让变量初始集真正“可注入”而非硬编码
客户端不 new 具体类,而是持有一个 ConfigFactory 实例(可通过 Spring Bean、ServiceLoader 或构造传入):
public class AppInitializer {
private final ConfigFactory factory;
public AppInitializer(ConfigFactory factory) {
this.factory = factory;
}
public void init() {
NetworkConfig net = factory.createNetworkConfig(); // 自动匹配当前版本
RetryPolicy retry = factory.createRetryPolicy();
// 组装进运行时环境变量或配置容器
Environment.set("network", net);
Environment.set("retry", retry);
}
}
切换版本只需替换工厂实例,无需改初始化逻辑——例如从 new V1ConfigFactory() 换成 new V2ConfigFactory(),所有变量初始值自动按新规则加载。
配合抽象类做安全兜底与共性初始化
抽象产品类(如 AbstractNetworkConfig)可封装跨版本通用行为:
- 提供受保护的构造器,强制校验 host 不为空、port 在合法范围
- 定义模板方法
onInit(),供子类在实例化后执行钩子(如日志记录、指标上报) - 声明
final字段存储不可变初始值,避免子类意外覆盖
这样既保留版本特性的灵活性,又守住基础约束和一致性边界。










