java中工厂方法替代new的核心是解耦、复用、控制和扩展,包括静态工厂方法、简单工厂类、工厂方法模式及配置+反射工厂四种实现方式。

Java 中用工厂方法替代 new,核心是把对象创建逻辑从调用方抽离出来,交给专门的“工厂”统一管理。这样做不是为了炫技,而是为了解耦、复用、控制和扩展。
静态工厂方法:一个类自己管自己的创建
在目标类内部定义静态方法,由它负责返回实例。这种方式最轻量,适合控制构造细节或复用对象。
- 用语义化命名代替生硬的
new,比如Integer.valueOf(100)比new Integer(100)更清晰,还自动缓存常用值 - 可以限制实例数量,如连接池中通过
Connection.create()控制最大并发连接数 - 能返回接口或父类型,隐藏具体实现,比如
LoggerFactory.getLogger()返回Logger接口,实际可能是ConsoleLogger或FileLogger
简单工厂类:一个类管多个同类对象的创建
单独写一个工厂类(通常含静态方法),根据参数决定创建哪种具体对象。
- 比如
LoggerFactory.createLogger("file")返回FileLogger实例,调用方完全不接触new FileLogger() - 客户端只依赖工厂和产品接口,新增日志类型时只需改工厂内部逻辑,不用动所有调用点
- 缺点是工厂类会随产品增多而膨胀,新增类型需修改原类,违反开闭原则
工厂方法模式:用多态解耦创建逻辑
定义抽象工厂接口,每种产品对应一个具体工厂类,把“怎么创建”下放到子类中。
- 例如支付系统里,
AlipayFactory和WechatPayFactory都实现PaymentFactory接口,各自负责创建对应的支付对象 - 新增支付方式(如
ApplePay)只需新增一个工厂类,完全不改动已有代码 - 调用方面向接口编程,运行时注入具体工厂,灵活性高,适合中大型系统
配置+反射工厂:运行时动态决定创建谁
把类名写在配置文件(如 properties)里,工厂类读取配置,用反射创建对象。
- 比如配置
dao.impl=CustomerDaoImpl,工厂类加载后执行Class.forName("CustomerDaoImpl").newInstance() - 无需编译就能切换实现,适合需要热插拔或环境隔离的场景
- 牺牲了一定的类型安全和可读性,但换来高度的外部可控性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











