Java工厂模式核心是将对象创建逻辑从客户端抽离至工厂类或工厂方法,包括简单工厂(静态方法,易用但违反开闭原则)、工厂方法模式(抽象工厂+具体子类,符合开闭原则)及枚举增强方式(类型安全、易扩展)。

在 Java 类中实现工厂模式,核心是把对象的创建逻辑从客户端代码中抽离出来,交给一个专门的“工厂类”或“工厂方法”来统一管理。这样客户端只需关心“要什么”,不用关心“怎么造”。下面分几种常见方式说明,重点讲清关键点和实用写法。
定义抽象产品接口或父类
工厂模式的前提是存在一组具有相同行为(方法)的不同实现类。先定义它们的共同契约:
// 抽象产品:规定所有子类必须实现的方法
interface Notification {
void send(String message);
}
// 具体产品:不同通知渠道的实现
class EmailNotification implements Notification {
public void send(String message) {
System.out.println("发送邮件:" + message);
}
}
class SmsNotification implements Notification {
public void send(String message) {
System.out.println("发送短信:" + message);
}
}
class PushNotification implements Notification {
public void send(String message) {
System.out.println("发送推送:" + message);
}
}
简单工厂(静态工厂方法)
最易上手的方式:用一个类(通常含静态方法)根据参数返回对应子类实例。虽不属 GoF 23 种设计模式之一,但广泛用于实际项目。
class NotificationFactory {
// 静态工厂方法:传入类型字符串,返回具体对象
public static Notification createNotification(String type) {
return switch (type.toLowerCase()) {
case "email" -> new EmailNotification();
case "sms" -> new SmsNotification();
case "push" -> new PushNotification();
default -> throw new IllegalArgumentException("不支持的通知类型: " + type);
};
}
}
// 使用示例
Notification notification = NotificationFactory.createNotification("sms");
notification.send("订单已支付");
- 优点:调用简洁,隐藏了 new 的细节
- 注意:新增子类时需修改工厂类,违反开闭原则;适合子类数量稳定、变化少的场景
工厂方法模式(面向对象的工厂)
把“创建对象”的责任延迟到子类,由不同工厂类负责生成特定产品。更符合开闭原则。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
// 抽象工厂:声明创建产品的接口
abstract class NotificationFactory {
// 模板方法:定义流程,具体创建交给子类
public final Notification createAndSend(String message) {
Notification notification = createNotification();
notification.send(message);
return notification;
}
// 工厂方法:由子类实现,决定创建哪个具体产品
protected abstract Notification createNotification();
}
// 具体工厂:只负责一种产品
class EmailNotificationFactory extends NotificationFactory {
protected Notification createNotification() {
return new EmailNotification();
}
}
class SmsNotificationFactory extends NotificationFactory {
protected Notification createNotification() {
return new SmsNotification();
}
}
// 使用示例
NotificationFactory factory = new SmsNotificationFactory();
factory.createAndSend("验证码已发送");
- 每个具体工厂只关注一个子类,新增类型只需加新工厂类,无需改旧代码
- 适合产品族扩展频繁、需要解耦创建逻辑与业务逻辑的场景
可选增强:结合枚举或配置驱动
避免硬编码字符串,提升可维护性。例如用枚举统一管理类型:
enum NotificationType {
EMAIL(EmailNotification::new),
SMS(SmsNotification::new),
PUSH(PushNotification::new);
private final Supplier<Notification> constructor;
NotificationType(Supplier<Notification> constructor) {
this.constructor = constructor;
}
public Notification create() {
return constructor.get();
}
}
// 使用
Notification n = NotificationType.SMS.create();
- 类型安全:编译期检查,不会传错字符串
- 集中管理:新增类型只需加枚举项和构造器引用,工厂逻辑零修改
工厂模式不是为了炫技,而是当发现代码里到处 new 子类、或者 if-else 判断类型再 new 时,就该考虑抽出一个工厂了。关键是让创建逻辑可复用、可测试、可替换——哪怕一开始只是个静态方法,也比散落各处的 new 更清晰。

















