抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是一种创建型设计模式,它提供了一种创建相关或依赖对象的接口,而无需指定它们的具体类。它的基本思想是:定义一个用于创建一系列相关或相互依赖对象的接口,而不需要指定他们的具体类。
在Java中,抽象工厂模式通常包括以下几个角色:
- AbstractFactory:抽象工厂,声明了创建产品对象的方法。
- ConcreteFactory:具体工厂,实现了创建产品对象的方法。
- AbstractProduct:抽象产品,声明了产品对象的共性接口。
- Product:具体产品,实现了抽象产品中的抽象方法,构成产品族。
- Client:客户端,通过调用工厂类的方法创建产品对象。
抽象工厂和工厂模式都是创建对象的设计模式,它们的主要区别什么呢?
目的不同:工厂模式用于创建一类产品对象的实例,而抽象工厂模式用于创建一组相关的产品对象实例。 实现方式不同:工厂模式中只有一个工厂类,该类负责创建所有的产品对象;而抽象工厂模式中有多个工厂类,每个工厂类负责创建一组相关的产品对象。 范围不同:工厂模式通常用于创建单个对象,而抽象工厂模式通常用于创建一组相关的对象
使用场景
-
当需要创建一组相关的产品对象,这些产品对象之间有共同的约束条件,需要一起使用时,可以使用抽象工厂模式。
-
当系统需要独立于产品的创建,组装和表示时,可以使用抽象工厂模式
-
当系统需要支持多个不同的产品族,且不希望依赖于具体产品类时,可以使用抽象工厂模式。
-
当系统需要在运行时切换不同的产品族时,可以使用抽象工厂模式。
-
当需要遵循“开闭原则”,即系统需要扩展新的产品族时,不需要修改已有代码,可以使用抽象工厂模式。
代码实现
假设有一个在线商店需要提供两种支付方式:信用卡支付和网银支付,每种支付方式又包含两种具体的实现:Visa 信用卡支付和 MasterCard 信用卡支付,以及支付宝网银支付和微信网银支付。 首先,定义支付方式的接口:
// 信用卡支付接口
public interface CreditCardPayment {
void pay(double amount);
}
// 网银支付接口
public interface OnlineBankingPayment {
void pay(double amount);
}
接着,定义具体的实现:
// Visa 信用卡支付
public class VisaCreditCardPayment implements CreditCardPayment {
@Override
public void pay(double amount) {
System.out.println("Visa credit card payment: $" + amount);
}
}
// MasterCard 信用卡支付
public class MasterCardCreditCardPayment implements CreditCardPayment {
@Override
public void pay(double amount) {
System.out.println("MasterCard credit card payment: $" + amount);
}
}
// 支付宝网银支付
public class AlipayOnlineBankingPayment implements OnlineBankingPayment {
@Override
public void pay(double amount) {
System.out.println("Alipay online banking payment: ¥" + amount);
}
}
// 微信网银支付
public class WeChatOnlineBankingPayment implements OnlineBankingPayment {
@Override
public void pay(double amount) {
System.out.println("WeChat online banking payment: ¥" + amount);
}
}
然后,定义抽象工厂类
// 抽象支付工厂
public abstract class PaymentFactory {
public abstract CreditCardPayment createCreditCardPayment();
public abstract OnlineBankingPayment createOnlineBankingPayment();
}
定义具体的支付工厂类:
// Visa 信用卡支付工厂
public class VisaPaymentFactory extends PaymentFactory {
@Override
public CreditCardPayment createCreditCardPayment() {
return new VisaCreditCardPayment();
}
@Override
public OnlineBankingPayment createOnlineBankingPayment() {
return new AlipayOnlineBankingPayment();
}
}
// MasterCard 信用卡支付工厂
public class MasterCardPaymentFactory extends PaymentFactory {
@Override
public CreditCardPayment createCreditCardPayment() {
return new MasterCardCreditCardPayment();
}
@Override
public OnlineBankingPayment createOnlineBankingPayment() {
return new WeChatOnlineBankingPayment();
}
}
最后,使用抽象工厂来创建支付对象
public class Client {
public static void main(String[] args) {
// 选择 Visa 信用卡支付工厂
PaymentFactory paymentFactory = new VisaPaymentFactory();
// 创建 Visa 信用卡支付对象
CreditCardPayment creditCardPayment = paymentFactory.createCreditCardPayment();
creditCardPayment.pay(100);
// 创建支付宝网银支付对象
OnlineBankingPayment onlineBankingPayment = paymentFactory.createOnlineBankingPayment();
onlineBankingPayment.pay(200);
// 选择 MasterCard 信用卡支付工厂
PaymentFactory paymentFactory2 = new MasterCardPaymentFactory();
// 创建 MasterCard 信用卡支付对象
CreditCardPayment creditCardPayment2 = paymentFactory2.createCreditCardPayment();
creditCardPayment2.pay(100);
// 创建微信网银支付对象
OnlineBankingPayment onlineBankingPayment2 = paymentFactory2.createOnlineBankingPayment();
onlineBankingPayment2.pay(200);
}
使用小结
-
Java 抽象工厂模式在很多框架和应用程序中都有广泛的应用。以下是一些具体的应用:
-
Java 数据库连接框架 JDBC 中,使用抽象工厂模式来创建连接对象,例如 Connection、Statement 等。
-
Java 中的 XML 处理器 DOM 和 SAX,也使用抽象工厂模式来创建解析器和生成器对象。
-
Java 中的 Java Cryptography Architecture (JCA) 也使用抽象工厂模式,用于创建加密算法和密钥生成器对象。
总之,Java 抽象工厂模式可以在许多应用程序和框架中找到,它可以帮助您更好地组织和管理代码,提高代码的可扩展性和灵活性。
评论( 0 )