目录
- 序章:当对象生产遇上选择困难症
- 第一章:创造者的基因分解 —— 模式核心架构
- 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表达式 | ★★★☆ | ★★★☆ | ★★★★ | 需要快速适配新需求 |
枚举工厂 | ★★☆ | ★★★★ | ★★☆ | 有限固定类型生产 |
终章:解构工厂哲学的次元壁
当你需要新增一款火星采矿车
时:
- 传统方式需要修改所有创建代码
- 而工厂方法模式只需要:
- 创建
MarsTruck
实现类 - 新增
MarsFactory
实现工厂接口 - 原有系统其他部分零修改
这就是工厂方法模式最迷人的魔法 —— 把变化关进笼子,让扩展自由飞翔。下次看到new
关键字时,不妨想想:这里是否应该有一个工厂守卫?🏭🚚