首页 > 其他分享 >15 设计模式之抽象工厂模式(支付系统案例)

15 设计模式之抽象工厂模式(支付系统案例)

时间:2024-12-05 19:33:18浏览次数:6  
标签:15 接口 工厂 抽象 产品 支付 设计模式 public

一、什么是抽象工厂模式

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

相关文章

  • rt-thread学习之路第四十九章--组件之FAL flash抽象层
    FAL组件FAL:Flash抽象层。在V4.1.0中,将fal软件包重新定义为RT-Thread内部组件,在使用方式上和以前有这些区别:(1)原本使用fal需要在RT-Thread的包管理器中选择并进行下载;(2)现在只需要在组件中打开使用即可,以下做详细介绍。1、FAL介绍FAL(FlashAbstractionLayer)F......
  • Qt5.15新建类报错是大小写问题吗?
    新建类小写,报错.cpp中头文件缺失,或者构造函数缺失kimi答案如果自定义的类名为Command,并且它是小写的,那么它默认情况下并不会继承自QObject。在Qt中,继承自QObject的类可以获得许多Qt框架提供的特性,比如信号和槽机制、事件处理、以及动态属性系统等。如果你希望Command类拥有这些......
  • C# 开发超高频 915MHz/2.45GHz 射频卡应用:原理、代码与案例解析
    目录引言超高频915MHz/2.45GHz射频卡的工作原理射频卡的工作频段与标准数据传输协议与通信方式C#开发环境配置与硬件要求硬件选择驱动与SDK配置C#与超高频射频卡通信实现初始化与连接发送与接收数据数据解析与处理案例解析:物流管理系统系统设计与需......
  • 洛谷二刷P4715 【深基16.例1】淘汰赛(c嘎嘎)
    题目链接:P4715【深基16.例1】淘汰赛-洛谷|计算机科学教育新生态题目难度:普及 刷题心得:本题是我二刷,之前第一次刷是在洛谷线性表那个题单,当时印象深刻第 一篇题解是用的树来做,当时我不屑一顾(觉得花里胡哨),现在我开始刷树的题目着字分析,第一次学习到线性树的用法现......
  • 设计模式开门之单例模式
    单例模式归属于设计模式大类(创建型、结构型、行为型)设计模式中的创建型模式。一个类只允许创建一个对象(实例)那么这个类就是单例类,这个设计模式就是单例设计模式。单例设计模式的这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该对象,提供了一个全局访问点来访问该......
  • C#知识点15
    什么是粘包“粘包”是在网络编程中经常出现的一个概念在基于TCP的网络通信中,“粘包”是指发送方发送的多个数据包被接收方当成一个数据包接收,或者接收方将一个数据包分割成多个部分接收的现象。这是因为TCP是一种面向字节流的协议,它不像UDP那样有消息边界为什么会出现......
  • C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等......
  • 蓝桥杯备考冲刺必刷题(Python) | P152 反倍数
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】给定三个整数a,b,c,如果一个整数既不是α的整数倍也不是b的整数倍还不是c的整数倍,则这个数称为反倍数。请问在1至n中有多少个......
  • (面试常考)Java基础 - 接口与抽象类的区别
    接口接口(Interface)的传统定义是只能包含抽象方法(即没有方法体的方法)以及常量。但是从Java8开始,接口可以包含非抽象方法了。这些非抽象方法包括:默认方法(DefaultMethods):使用default关键字声明的方法。它们允许在接口中提供一个方法的默认实现,这样实现了该接口的类可......
  • 掌握设计模式之简单工厂模式
    简单工厂模式简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,它定义了一个工厂类,该类可以根据传入的参数决定创建哪种产品类的实例。简单工厂模式将对象的创建逻辑封装在一个工厂类中,客户端只需要通过工厂类获取实例,而不需要直接涉及实例化的细节。简单工厂模式包含三......