Java 设计模式:工厂模式详解
工厂模式(Factory Pattern)是一种创建型设计模式,它通过将对象的创建过程封装到工厂类中,避免了直接使用 new
关键字创建对象,从而提高了代码的灵活性和可维护性。本文将介绍工厂模式的定义、分类及其在 Java 中的实现方式。
1. 什么是工厂模式?
工厂模式的核心思想是:定义一个用于创建对象的接口或类,让调用者通过工厂获取对象实例,而无需关心对象的具体创建细节。它遵循“开闭原则”,便于扩展新类型对象。
模式分类
工厂模式通常分为三种:
- 简单工厂模式(Simple Factory):通过一个工厂类根据参数创建不同对象(非 GoF 23 种设计模式之一,但常被提及)。
- 工厂方法模式(Factory Method):定义一个创建对象的接口,由子类决定实例化哪个类。
- 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或依赖对象的接口。
2. 简单工厂模式实现
2.1 示例场景
假设我们要创建一个支付系统,支持微信支付和支付宝支付。
2.2 定义产品接口
public interface Payment {
void pay(double amount);
}
2.3 实现具体产品
public class WeChatPayment implements Payment {
@Override
public void pay(double amount) {
System.out.println("通过微信支付 " + amount + " 元");
}
}
public class AlipayPayment implements Payment {
@Override
public void pay(double amount) {
System.out.println("通过支付宝支付 " + amount + " 元");
}
}
2.4 创建简单工厂
public class PaymentFactory {
public static Payment createPayment(String type) {
switch (type) {
case "wechat":
return new WeChatPayment();
case "alipay":
return new AlipayPayment();
default:
throw new IllegalArgumentException("未知的支付类型: " + type);
}
}
}
2.5 客户端使用
public class Client {
public static void main(String[] args) {
Payment wechat = PaymentFactory.createPayment("wechat");
wechat.pay(100.0);
Payment alipay = PaymentFactory.createPayment("alipay");
alipay.pay(50.0);
}
}
输出结果
通过微信支付 100.0 元
通过支付宝支付 50.0 元
简单工厂特点
- 优点:简单易用,适合产品类型较少的场景。
- 缺点:新增支付方式时需修改工厂类,违反“开闭原则”。
3. 工厂方法模式实现
3.1 示例场景
改进支付系统,每种支付方式拥有独立的工厂。
3.2 定义抽象工厂接口
public interface PaymentFactory {
Payment createPayment();
}
3.3 实现具体工厂
public class WeChatPaymentFactory implements PaymentFactory {
@Override
public Payment createPayment() {
return new WeChatPayment();
}
}
public class AlipayPaymentFactory implements PaymentFactory {
@Override
public Payment createPayment() {
return new AlipayPayment();
}
}
3.4 客户端使用
public class Client {
public static void main(String[] args) {
PaymentFactory wechatFactory = new WeChatPaymentFactory();
Payment wechat = wechatFactory.createPayment();
wechat.pay(100.0);
PaymentFactory alipayFactory = new AlipayPaymentFactory();
Payment alipay = alipayFactory.createPayment();
alipay.pay(50.0);
}
}
输出结果
同简单工厂。
工厂方法特点
- 优点:新增支付方式只需新增工厂类,符合“开闭原则”。
- 缺点:类数量增加,系统复杂度提升。
4. 抽象工厂模式实现
4.1 示例场景
扩展支付系统,新增支付和退款功能,涉及一组相关产品。
4.2 定义产品族接口
public interface Payment {
void pay(double amount);
}
public interface Refund {
void refund(double amount);
}
4.3 实现具体产品
public class WeChatPayment implements Payment {
@Override
public void pay(double amount) {
System.out.println("通过微信支付 " + amount + " 元");
}
}
public class WeChatRefund implements Refund {
@Override
public void refund(double amount) {
System.out.println("通过微信退款 " + amount + " 元");
}
}
public class AlipayPayment implements Payment {
@Override
public void pay(double amount) {
System.out.println("通过支付宝支付 " + amount + " 元");
}
}
public class AlipayRefund implements Refund {
@Override
public void refund(double amount) {
System.out.println("通过支付宝退款 " + amount + " 元");
}
}
4.4 定义抽象工厂接口
public interface PaymentAbstractFactory {
Payment createPayment();
Refund createRefund();
}
4.5 实现具体工厂
public class WeChatFactory implements PaymentAbstractFactory {
@Override
public Payment createPayment() {
return new WeChatPayment();
}
@Override
public Refund createRefund() {
return new WeChatRefund();
}
}
public class AlipayFactory implements PaymentAbstractFactory {
@Override
public Payment createPayment() {
return new AlipayPayment();
}
@Override
public Refund createRefund() {
return new AlipayRefund();
}
}
4.6 客户端使用
public class Client {
public static void main(String[] args) {
PaymentAbstractFactory wechatFactory = new WeChatFactory();
Payment wechatPayment = wechatFactory.createPayment();
Refund wechatRefund = wechatFactory.createRefund();
wechatPayment.pay(100.0);
wechatRefund.refund(20.0);
PaymentAbstractFactory alipayFactory = new AlipayFactory();
Payment alipayPayment = alipayFactory.createPayment();
Refund alipayRefund = alipayFactory.createRefund();
alipayPayment.pay(50.0);
alipayRefund.refund(10.0);
}
}
输出结果
通过微信支付 100.0 元
通过微信退款 20.0 元
通过支付宝支付 50.0 元
通过支付宝退款 10.0 元
抽象工厂特点
- 优点:适合创建一组相关对象,保证产品族的统一性。
- 缺点:新增产品族(如新增银联支付)简单,但新增产品种类(如新增查询功能)需修改接口,扩展性有限。
5. 工厂模式的优点与缺点
优点
- 封装创建过程:隐藏对象创建细节,降低耦合。
- 扩展性强:工厂方法和抽象工厂支持灵活扩展。
- 复用性高:统一管理对象创建逻辑。
缺点
- 类数量增加:特别是工厂方法和抽象工厂模式,会引入更多类。
- 复杂度提升:对简单场景可能显得过于复杂。
6. 实际应用场景
- Spring 中的 BeanFactory:Spring 框架使用工厂模式创建和管理 Bean。
- JDBC 驱动管理:
DriverManager
通过工厂模式加载不同数据库驱动。 - 日志框架:如 SLF4J 的
LoggerFactory
,动态创建日志实例。
7. 总结
工厂模式是 Java 中最常用的设计模式之一,通过简单工厂、工厂方法和抽象工厂三种形式,满足了从简单到复杂的对象创建需求。简单工厂适合小型系统,工厂方法强调扩展性,抽象工厂则适用于产品族场景。掌握工厂模式,能让你的代码更灵活、可维护,值得在实际项目中实践!
希望这篇博文对你理解工厂模式有所帮助!如果有其他设计模式相关需求,欢迎留言交流。