Java工厂模式解析:灵活对象创建的实践指南
精心整理了最新的面试资料和简历模板,有需要的可以自行获取
点击前往百度网盘获取
点击前往夸克网盘获取
一、模式定义与分类
工厂模式(Factory Pattern)是创建型设计模式的核心成员之一,主要解决对象创建过程中的灵活性问题。根据抽象程度不同分为三种形态:
- 简单工厂(静态工厂)
- 工厂方法模式
- 抽象工厂模式
二、模式适用场景
- 需要隔离对象创建逻辑时
- 系统需要动态扩展产品族时
- 需要统一管理对象创建过程
- 对象创建依赖复杂初始化参数
三、模式实现演进
3.1 简单工厂模式
// 产品接口
interface Vehicle {
void deliver();
}
class Truck implements Vehicle {
@Override
public void deliver() {
System.out.println("陆路运输");
}
}
class Ship implements Vehicle {
@Override
public void deliver() {
System.out.println("海运运输");
}
}
// 简单工厂
class VehicleFactory {
public static Vehicle createVehicle(String type) {
return switch (type.toLowerCase()) {
case "truck" -> new Truck();
case "ship" -> new Ship();
default -> throw new IllegalArgumentException("未知运输类型");
};
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
Vehicle transport = VehicleFactory.createVehicle("truck");
transport.deliver();
}
}
特点:
- 静态创建方法
- 违反开闭原则(新增类型需修改工厂)
- 适合产品类型较少的情况
3.2 工厂方法模式
// 抽象工厂
abstract class Logistics {
public void planDelivery() {
Vehicle vehicle = createVehicle();
vehicle.deliver();
}
// 工厂方法
abstract Vehicle createVehicle();
}
// 具体工厂
class RoadLogistics extends Logistics {
@Override
Vehicle createVehicle() {
return new Truck();
}
}
class SeaLogistics extends Logistics {
@Override
Vehicle createVehicle() {
return new Ship();
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
Logistics logistics = new RoadLogistics();
logistics.planDelivery();
}
}
优势:
- 符合开闭原则
- 创建逻辑延迟到子类
- 支持多态创建
3.3 抽象工厂模式
// 产品族接口
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// 具体工厂
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
class MacOSFactory implements GUIFactory {
public Button createButton() {
return new MacOSButton();
}
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
// 客户端代码
public class Application {
private GUIFactory factory;
public Application(GUIFactory factory) {
this.factory = factory;
}
public void renderUI() {
Button button = factory.createButton();
button.paint();
}
}
应用场景:
- 需要创建产品族
- 保证产品兼容性
- 跨平台UI开发
- 数据库访问抽象
四、模式对比分析
维度 | 简单工厂 | 工厂方法 | 抽象工厂 |
---|---|---|---|
创建范围 | 单一产品 | 单一产品 | 产品族 |
扩展性 | 修改工厂类 | 新增子类 | 新增工厂类 |
复杂度 | 低 | 中 | 高 |
适用场景 | 固定产品类型 | 单一产品扩展 | 关联产品组合 |
五、最佳实践建议
- 避免过度设计:简单场景优先考虑简单工厂
- 结合依赖注入:Spring等框架中常用工厂模式实现IoC
- 使用枚举优化:增强简单工厂的可维护性
- 注意层次划分:抽象工厂推荐使用接口而非抽象类
六、实际应用案例
- JDK中的
Calendar.getInstance()
- Spring框架的BeanFactory
- Logback日志框架的AppenderFactory
- JUnit测试用例工厂
通过本文可以全面了解工厂模式的不同形态及其适用场景。实际开发中应根据业务复杂度选择合适的工厂实现,在灵活性和简洁性之间找到最佳平衡点。工厂模式的价值不仅在于对象创建本身,更在于它为实现依赖倒置原则提供了有效途径。