一、什么是抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是创建型设计模式之一,用于提供一个接口,用来创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。
抽象工厂模式允许客户端通过工厂接口来创建一系列相关的产品对象,而无需知道具体的产品类。它提供了一种创建一系列相关或依赖对象的方式,而无需显式地指定具体的类。
抽象工厂模式通常适用于以下场景:
- 当系统中存在多个产品族(例如支付方式),每个产品族包含多个具体的产品(例如支付宝、微信支付等),客户端需要根据需求选择合适的产品族时。
- 当系统需要支持多个不同的产品族,而不希望系统依赖于具体产品类。
二、抽象工厂模式的组成
在抽象工厂模式中,通常有以下几个角色:
- 抽象产品(Product):定义了产品的抽象接口,每种具体的产品都实现这个接口。
- 具体产品(ConcreteProduct):实现了抽象产品接口,定义具体产品的行为。
- 抽象工厂(Factory):定义了创建抽象产品的方法。
- 具体工厂(ConcreteFactory):实现了抽象工厂的方法,创建具体产品。
- 客户端(Client):依赖于抽象工厂,通过工厂创建具体产品,而不直接与具体产品类打交道。
三、通过案例来讲解抽象工厂模式
我们以一个支付系统为例,来展示如何使用抽象工厂模式。
假设我们有多个支付方式(支付宝、微信支付、银行卡支付),每个支付方式都有一个 pay()
方法。我们的目标是通过抽象工厂模式来动态创建支付方式,并进行支付操作。
1. 抽象产品接口
首先,我们定义一个抽象产品接口 Payment
,所有支付方式都要实现这个接口:
public interface Payment {
void pay(double amount); // 支付方法,执行支付操作
}
2. 具体产品类
支付宝支付(Alipay
):
public class Alipay implements Payment {
@Override
public void pay(double amount) {
System.out.println("使用支付宝支付了 " + amount + " 元");
}
}
微信支付(WeChatPay
):
public class WeChatPay implements Payment {
@Override
public void pay(double amount) {
System.out.println("使用微信支付了 " + amount + " 元");
}
}
银行卡支付(BankCardPay
):
public class BankCardPay implements Payment {
@Override
public void pay(double amount) {
System.out.println("使用银行卡支付了 " + amount + " 元");
}
}
3. 抽象工厂接口
接下来,我们定义一个抽象工厂接口 PaymentFactory
,它声明了一个工厂方法 createPayment()
,用于创建不同的支付方式:
public interface PaymentFactory {
Payment createPayment(); // 创建支付方式的工厂方法
}
4. 具体工厂类
然后,我们实现几个具体工厂类,每个具体工厂负责创建相应的支付产品:
支付宝支付工厂(AlipayFactory
):
public class AlipayFactory implements PaymentFactory {
@Override
public Payment createPayment() {
return new Alipay(); // 返回支付宝支付对象
}
}
微信支付工厂(WeChatPayFactory
):
public class WeChatPayFactory implements PaymentFactory {
@Override
public Payment createPayment() {
return new WeChatPay(); // 返回微信支付对象
}
}
银行卡支付工厂(BankCardFactory
):
public class BankCardFactory implements PaymentFactory {
@Override
public Payment createPayment() {
return new BankCardPay(); // 返回银行卡支付对象
}
}
5. 客户端(ShoppingCart
)
客户端通过工厂来创建支付方式对象,并执行支付操作:
public class ShoppingCart {
private PaymentFactory paymentFactory;
public ShoppingCart(PaymentFactory paymentFactory) {
this.paymentFactory = paymentFactory; // 接收一个工厂对象
}
public void checkout(double amount) {
Payment payment = paymentFactory.createPayment(); // 使用工厂创建支付方式
payment.pay(amount); // 调用支付操作
}
}
6. 测试类
最后,编写一个测试类来演示如何使用抽象工厂模式:
public class TestAbstractFactory {
public static void main(String[] args) {
// 用户选择支付宝支付
PaymentFactory alipayFactory = new AlipayFactory();
ShoppingCart cart = new ShoppingCart(alipayFactory);
cart.checkout(100.0); // 支付100元
// 用户选择微信支付
PaymentFactory weChatPayFactory = new WeChatPayFactory();
cart = new ShoppingCart(weChatPayFactory);
cart.checkout(200.0); // 支付200元
// 用户选择银行卡支付
PaymentFactory bankCardFactory = new BankCardFactory();
cart = new ShoppingCart(bankCardFactory);
cart.checkout(50.0); // 支付50元
}
}
四、运行结果
运行测试类后,控制台会输出如下内容:
使用支付宝支付了 100.0 元
使用微信支付了 200.0 元
使用银行卡支付了 50.0 元
五、总结
1.优缺点
通过本次案例的实现,我们展示了如何使用抽象工厂模式来动态创建不同的支付方式对象,进而执行支付操作。
抽象工厂模式的关键在于通过工厂接口将具体的产品类隐藏在工厂后面,使得客户端代码只依赖于工厂接口和抽象产品接口,而不需要关心具体的产品实现。这样,我们可以在不修改客户端代码的情况下,扩展新的支付方式产品,符合 开闭原则。
解耦客户端和具体产品 | 增加了系统复杂度 |
易于扩展新产品 | 不易扩展新的产品族 |
提供一族产品的创建 | 需要创建大量额外的类和接口 |
遵循开闭原则(对扩展开放,对修改关闭) | 客户端仍然需要选择具体工厂,存在耦合 |
2.适用场景
- 产品族管理:当系统中有多个不同的产品族(例如不同支付方式)时,抽象工厂模式可以帮助我们更好地管理这些产品族。
- 需要跨平台的应用:例如,支持多种支付方式的应用,可以根据不同的平台选择相应的支付方式。
希望这篇博客能够帮助你更好地理解 抽象工厂模式,以及如何通过实际的案例来应用这个设计模式。如果你有任何问题或需要进一步讨论,欢迎留言!
标签:15,接口,工厂,抽象,产品,支付,设计模式,public From: https://blog.csdn.net/Theodore_1022/article/details/144273810