小蔡学Java

Java之设计模式 (六)

2023-09-16 17:56 1413 0 设计模式 设计模式抽象工厂模式

抽象工厂模式(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 )

  • 博主 Mr Cai
  • 坐标 河南 信阳
  • 标签 Java、SpringBoot、消息中间件、Web、Code爱好者

文章目录