目录

  • 序章:当对象生产遇上选择困难症
  • 第一章:创造者的基因分解 —— 模式核心架构
  • 1.1 四大构成要素
  • 第二章:五大制造流派
  • 2.1 传统派:抽象类继承法
  • 2.2 激进派:接口实现流
  • 2.3 复古派:反射工厂
  • 2.4 现代派:函数式工厂(Java8+)
  • 2.5 极端派:枚举工厂
  • 第三章:装配线优化艺术
  • 3.1 模板方法模式加持
  • 3.2 缓存对象池优化
  • 第四章:战地医院 —— 异常处理方案
  • 4.1 工厂方法的防御编程
  • 第五章:航天级工厂 —— Spring的高级应用
  • 5.1 Bean工厂的现代演绎
  • 第六章:工厂江湖兵器谱
  • 终章:解构工厂哲学的次元壁

序章:当对象生产遇上选择困难症

🛠 生产事故现场
假设你在开发一个国际物流系统,需要创建不同国家的卡车:
中国重卡需要左舵驾驶室,
英国卡车必须右舵布局,
沙特卡车要加装防沙滤清器…

如果满屏都是new ChineseTruck()new BritishTruck(),系统就会变成可维护性灾区!工厂方法模式就是你的"智能制造解决方案"。


第一章:创造者的基因分解 —— 模式核心架构

1.1 四大构成要素

// 产品基因库
interface Truck {void deliver(); // 所有卡车的统一动作
}// 具体产品型号
class ChineseTruck implements Truck {public void deliver() { System.out.println("中国重卡驰骋于G7京新高速"); }
}
// 工厂基因组
interface TruckFactory {Truck createTruck(); // 抽象工厂方法
}// 中国分厂实现
class ChineseTruckFactory implements TruckFactory {public Truck createTruck() { return new ChineseTruck(); // 具体生产流程}
}

第二章:五大制造流派

2.1 传统派:抽象类继承法

abstract class LogisticsCompany {// 工厂方法本体(可提供默认实现)public abstract Truck orderTruck();// 业务模板方法public void planDelivery() {Truck truck = orderTruck();truck.deliver();}
}// 欧洲分公司
class EuropeLogistics extends LogisticsCompany {@Overridepublic Truck orderTruck() {return new EuropeanTruck();}
}

2.2 激进派:接口实现流

interface CloudLogistics {// 静态工厂方法(JDK8+特性)static Truck createTruck(Region region) {return switch (region) {case ASIA -> new ChineseTruck();case EUROPE -> new EuropeanTruck();case MID_EAST -> new SaudiTruck();};}
}// 调用示例
Truck dubaiTruck = CloudLogistics.createTruck(Region.MID_EAST);

2.3 复古派:反射工厂

class UniversalFactory {// 通过类名动态生成public static <T extends Truck> T createTruck(Class<T> clazz) {try {return clazz.getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException("生成失败", e);}}
}// 动态创建实例
Truck truck = UniversalFactory.createTruck(ChineseTruck.class);

2.4 现代派:函数式工厂(Java8+)

// 工厂方法即函数
public class LambdaFactory {private final Supplier<Truck> constructor;public LambdaFactory(Supplier<Truck> constructor) {this.constructor = constructor;}public Truck produce() {return constructor.get();}
}// 使用示例
LambdaFactory factory = new LambdaFactory(ChineseTruck::new);
Truck truck = factory.produce();

2.5 极端派:枚举工厂

enum CountryFactory {CHINA {public Truck create() { return new ChineseTruck(); }},UK {public Truck create() { return new BritishTruck(); }};public abstract Truck create();
}// 枚举调用
Truck londonTruck = CountryFactory.UK.create();

第三章:装配线优化艺术

3.1 模板方法模式加持

abstract class SmartFactory {// 模板方法定义流程public final Truck manufacturing() {Truck truck = createTruck();qualityCheck(truck);registerTracking(truck);return truck;}protected abstract Truck createTruck();private void qualityCheck(Truck t) { /*...*/ }private void registerTracking(Truck t) { /*...*/ }
}

3.2 缓存对象池优化

class RecyclableTruckFactory implements TruckFactory {private final Queue<Truck> pool = new LinkedList<>();public Truck createTruck() {if (pool.isEmpty()) {return new ChineseTruck(); }return pool.poll().reset(); // 重用对象}public void recycle(Truck truck) {pool.offer(truck);}
}

第四章:战地医院 —— 异常处理方案

4.1 工厂方法的防御编程

class SafeTruckFactory implements TruckFactory {public Truck createTruck() {try {return doCreate();} catch (PartsMissingException e) {return new EmergencyTruck(); // 降级处理}}private Truck doCreate() throws PartsMissingException {// 可能抛出异常的实际创建过程}
}

第五章:航天级工厂 —— Spring的高级应用

5.1 Bean工厂的现代演绎

@Configuration
public class FactoryConfig {@Bean@Scope("prototype")public Truck chineseTruck() {return new ChineseTruck();}@Beanpublic TruckFactory truckFactory() {return region -> {// 根据区域返回不同Beanreturn applicationContext.getBean(region.name() + "Truck");};}
}// 在Controller中自动装配
@Autowired 
private TruckFactory truckFactory;

第六章:工厂江湖兵器谱

实现方式

扩展性

可读性

灵活性

适用场景

抽象类继承

★★★★

★★★★

★★☆

传统分层架构

接口实现

★★★☆

★★★★

★★★☆

多团队协作定义

反射机制

★★★★

★★☆

★★★★

动态配置场景

Lambda表达式

★★★☆

★★★☆

★★★★

需要快速适配新需求

枚举工厂

★★☆

★★★★

★★☆

有限固定类型生产


终章:解构工厂哲学的次元壁

当你需要新增一款火星采矿车时:

  • 传统方式需要修改所有创建代码
  • 而工厂方法模式只需要:
  1. 创建MarsTruck实现类
  2. 新增MarsFactory实现工厂接口
  3. 原有系统其他部分零修改

这就是工厂方法模式最迷人的魔法 —— 把变化关进笼子,让扩展自由飞翔。下次看到new关键字时,不妨想想:这里是否应该有一个工厂守卫?🏭🚚