工厂模式通过抽象类型统一入口实现解耦:业务代码只调用行为(如button.render()),不关心new、类名或类型判断;新增产品只需扩展实现类和工厂,业务代码零修改;工厂封装初始化细节并自身面向接口,避免instanceof、字符串类名及简单工厂if-else硬编码。

工厂模式解耦对象创建逻辑,核心是把“谁来造”和“怎么用”彻底分开——业务代码只管调用行为,不碰 new、不认具体类名、不写 if-else 判断类型。
用抽象类型统一入口,屏蔽具体实现
所有产品必须实现同一接口或继承同一抽象类,工厂返回的也必须是这个抽象类型。客户端拿到的是 Button、Logger 或 PaymentProcessor 这样的引用,而不是 WindowsButton、FileLogger、AlipayProcessor。
- 调用方写 button.render(),完全不知道背后是哪个子类在执行
- 新增 LinuxButton 或 CloudLogger,只需加实现类和对应工厂,业务代码一行不改
- 如果工厂返回具体类(如 return new MacButton()),但方法签名却是 MacButton createButton(),那就没解耦——调用方仍被绑定到 MacButton 类型
把创建细节下沉到工厂内部
对象初始化所需的参数、依赖、配置、校验、缓存、代理等,全部封装在工厂里。业务层看不见也不用关心。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- DBLoggerFactory 内部组装 DataSource、设置连接超时、预热连接池
- AlipayFactory 可读取密钥配置、添加签名拦截器、包装重试逻辑
- 客户端只传一个标识(如 "alipay" 或枚举 PAYMENT_ALIPAY),不传构造参数、不处理异常分支
让工厂本身也保持抽象和可替换
工厂不是硬编码的工具类,它自己也要面向接口编程,便于运行时切换或测试隔离。
- 定义 PaymentFactory 接口,声明 create(String type) 方法
- 不同环境用不同实现:开发用 MockFactory,生产用 Spring 注入的 RealPaymentFactory
- 单元测试时直接注入模拟工厂,无需启动数据库或网络,业务逻辑验证更干净
避免常见解耦失效点
解耦不是加个工厂类就自动成立,几个关键动作漏掉,耦合就会悄悄回来。
- 业务代码里出现 instanceof 或强制转型,说明多态没走通,工厂返回类型不对
- 用类名字符串(如 "com.example.AlipayProcessor")作为工厂参数,会把编译期依赖带进来;应改用业务标识(如 "alipay")
- 简单工厂里堆满 if-else 分支,且每次加新类型都要改工厂源码——这违反开闭原则,该升级为工厂方法模式
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










