lambda 表达式不是工厂方法模式的实现,但可通过函数式接口抽象创建策略并用 lambda 提供具体逻辑,替代传统子类重写,支持运行时动态选择与 map 注册管理,适用于简单或参数化工厂场景。

Java 中 Lambda 表达式本身不是工厂方法模式的实现,但它可以简洁、高效地替代传统工厂类中的具体创建逻辑,让工厂方法变得更轻量、更函数式。关键在于:把“创建对象的策略”抽象为函数式接口,再用 Lambda 表达式提供具体实现。
用 Lambda 替代具体的 Creator 类
传统工厂方法模式中,你通常定义一个抽象工厂方法(如 createProduct()),再由子类重写它。而 Lambda 允许你跳过子类定义,直接传入创建逻辑:
- 定义一个函数式接口(例如
Supplier<product></product>或自定义的ProductFactory)作为工厂契约; - 把原本分散在多个子类里的
new XxxProduct()逻辑,改写成一行 Lambda; - 工厂类或调用方持有该函数式接口引用,运行时动态决定创建什么。
典型写法示例
假设要创建不同类型的 Notification:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
// 函数式接口(可复用,也可直接用 Supplier)
interface NotificationFactory {
Notification create(String content);
}
// 使用 Lambda 构建不同工厂实例
NotificationFactory emailFactory = content -> new EmailNotification(content);
NotificationFactory smsFactory = content -> new SmsNotification(content);
NotificationFactory pushFactory = content -> new PushNotification(content);
// 运行时选择
NotificationFactory factory = isUrgent ? smsFactory : emailFactory;
Notification notification = factory.create("Order shipped");
结合 Map 实现简易注册中心式工厂
进一步提升灵活性,可用 Map<string notificationfactory></string> 管理多种 Lambda 工厂,避免 if-else 或 switch:
- 启动时将各类 Lambda 注册进 Map(如
factories.put("email", content -> new EmailNotification(content))); - 根据配置或参数(如字符串类型名)查出对应 Lambda 并执行;
- 新增类型只需加一行 Lambda 注册,无需改原有类结构,符合开闭原则。
注意事项与边界
Lambda 实现的是“简单工厂”或“参数化工厂”的语义,不等同于经典 GoF 工厂方法的完整继承结构:
- 它不支持运行时动态添加子类行为(但可通过新 Lambda + 注册弥补);
- 无法直接体现“产品族”或“层级继承关系”,复杂场景仍需抽象工厂或模板方法配合;
- 调试时 Lambda 堆栈不如具名方法直观,建议关键路径辅以方法引用(
EmailNotification::new)或私有工具方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










