当前位置: 首页 > news >正文

“设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)都是常见的设计模式,但它们解决的问题和应用场景不同。下面是它们的区别:

1. 目的不同:

  • 工厂模式(Factory Pattern):
    工厂模式的主要目的是创建对象。它通过定义一个创建对象的接口,让子类决定实例化哪一个具体类,从而将对象创建的逻辑与使用的代码分离。

    工厂模式可以分为简单工厂、工厂方法和抽象工厂三种类型:

    • 简单工厂:通过一个工厂类来根据条件创建具体对象。
    • 工厂方法:定义一个工厂接口,并让具体的子类决定创建哪种对象。
    • 抽象工厂:提供多个相关对象的创建接口。

    使用场景:当需要在程序中通过统一接口创建不同类型的对象时使用。

  • 策略模式(Strategy Pattern):
    策略模式的主要目的是改变行为。它定义了一系列算法,将每个算法封装起来,使得它们可以相互替换。客户端根据需要选择具体的算法或策略。

    策略模式的关键是:允许在运行时根据不同的需求动态地选择某种行为或算法,而不需要修改客户端代码。

    使用场景:当有多个算法可以完成同样的工作,并且需要在运行时动态选择时使用。

2. 实现结构不同:

  • 工厂模式:

    • 包含一个工厂类(或工厂方法),用于创建对象。
    • 用户通过工厂类获取对象的实例,不需要直接使用构造函数。
    • 类似于:对象的创建委托给工厂

    示例:

    interface Product { }
    class ConcreteProductA implements Product { }
    class ConcreteProductB implements Product { }class ProductFactory {public Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();}return null;}
    }
    
  • 策略模式:

    • 包含一组算法或策略类,每个类实现相同的接口,但提供不同的算法实现。
    • 用户根据需求选择具体的策略类来调用。
    • 类似于:行为的替换由策略控制

    示例:

    interface Strategy {void execute();
    }
    class ConcreteStrategyA implements Strategy {public void execute() { System.out.println("Strategy A"); }
    }
    class ConcreteStrategyB implements Strategy {public void execute() { System.out.println("Strategy B"); }
    }class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
    }
    

3. 关注点不同:

  • 工厂模式关注的是如何创建对象。它解决了对象的创建逻辑,使得客户端不需要关心对象的具体创建过程。
  • 策略模式关注的是如何动态选择行为。它将不同的算法封装在独立的类中,并通过组合的方式让客户端可以在运行时灵活选择算法。

4. 典型应用场景:

  • 工厂模式:

    • 需要创建大量相似类型的对象。
    • 根据不同的条件,生成不同类型的对象。
    • 抽象出对象的创建过程,以提高代码的可扩展性和维护性。
  • 策略模式:

    • 需要在不同情况下选择不同的算法或行为。
    • 需要动态地切换算法,避免代码中出现大量的 if-elseswitch 语句。
    • 提供一组可互换的行为,并根据上下文决定具体使用哪一个。

小的总结:

  • 工厂模式解决的是对象创建问题,主要用于创建复杂对象或提供统一的创建接口。
  • 策略模式解决的是行为选择问题,主要用于动态选择和替换算法或策略。

以下案例:电子商务系统中的支付处理

假设我们正在设计一个电子商务系统,其中用户可以通过多种支付方式完成购买,例如信用卡、PayPal、比特币等。系统需要能够处理不同的支付方式,并且在运行时能够灵活地选择和切换支付策略。

1. 工厂模式用于创建支付策略

首先,我们可以使用工厂模式来创建不同的支付策略对象。工厂模式在这里的作用是根据支付方式的不同来生成相应的支付处理策略对象。

步骤:

  1. 定义支付策略接口(Strategy):

    interface PaymentStrategy {void pay(double amount);
    }
    
  2. 实现具体支付策略(ConcreteStrategy):

    class CreditCardPayment implements PaymentStrategy {private String cardNumber;private String cardHolder;public CreditCardPayment(String cardNumber, String cardHolder) {this.cardNumber = cardNumber;this.cardHolder = cardHolder;}@Overridepublic void pay(double amount) {System.out.println("Paid " + amount + " using Credit Card.");}
    }class PayPalPayment implements PaymentStrategy {private String email;public PayPalPayment(String email) {this.email = email;}@Overridepublic void pay(double amount) {System.out.println("Paid " + amount + " using PayPal.");}
    }
    
  3. 定义支付策略工厂接口(Factory):

    interface PaymentFactory {PaymentStrategy createPaymentStrategy();
    }
    
  4. 实现具体支付策略工厂(Concrete Factory):

    class CreditCardPaymentFactory implements PaymentFactory {private String cardNumber;private String cardHolder;public CreditCardPaymentFactory(String cardNumber, String cardHolder) {this.cardNumber = cardNumber;this.cardHolder = cardHolder;}@Overridepublic PaymentStrategy createPaymentStrategy() {return new CreditCardPayment(cardNumber, cardHolder);}
    }class PayPalPaymentFactory implements PaymentFactory {private String email;public PayPalPaymentFactory(String email) {this.email = email;}@Overridepublic PaymentStrategy createPaymentStrategy() {return new PayPalPayment(email);}
    }
    
2. 策略模式用于处理支付逻辑

接下来,策略模式用于实际处理支付逻辑。我们可以在系统中定义一个上下文类,它持有一个策略对象,并且委托策略对象执行支付操作。

步骤:

  1. 定义支付上下文(Context):

    class PaymentContext {private PaymentStrategy paymentStrategy;public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void executePayment(double amount) {paymentStrategy.pay(amount);}
    }
    
  2. 在客户端使用工厂模式和策略模式:

    public class PaymentDemo {public static void main(String[] args) {// 根据用户选择创建支付策略工厂PaymentFactory paymentFactory;PaymentStrategy paymentStrategy;// 模拟用户选择信用卡支付paymentFactory = new CreditCardPaymentFactory("1234-5678-9876-5432", "John Doe");paymentStrategy = paymentFactory.createPaymentStrategy();PaymentContext paymentContext = new PaymentContext(paymentStrategy);paymentContext.executePayment(150.0);// 模拟用户选择PayPal支付paymentFactory = new PayPalPaymentFactory("user@example.com");paymentStrategy = paymentFactory.createPaymentStrategy();paymentContext = new PaymentContext(paymentStrategy);paymentContext.executePayment(250.0);}
    }
    

总结

  • 工厂模式在这个示例中负责创建不同的支付策略对象(如信用卡支付、PayPal支付等)。它封装了创建策略的细节,使得客户端代码只需要关注策略的使用,而不需要了解创建策略的复杂过程。

  • 策略模式则用于定义和实现不同的支付处理逻辑。通过策略模式,我们可以在运行时动态选择支付方式,并将支付逻辑封装在具体的策略实现中。

通过结合这两种模式,我们能够创建一个灵活且易于扩展的支付处理系统。工厂模式确保了支付策略的创建过程的统一性和一致性,而策略模式则确保了支付逻辑的灵活性和可替换性。

相关文章:

“设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)都是常见的设计模式,但它们解决的问题和应用场景不同。下面是它们的区别: 1. 目的不同: 工厂模式(Factory Pattern&#xf…...

第二百一十九节 JPA 教程 - JPA 字段映射示例

JPA 教程 - JPA 字段映射示例 当将 Java bean 字段映射到数据库列时,我们可以选择标记字段,标记 getter 方法并标记两者。 标记字段 以下代码来自 Professor.java。 它显示如何将主键列标记为 Java bean 字段标识。 package cn.w3cschool.common; im…...

目标检测-YOLOv6

YOLOv6 YOLOv6 是 YOLO 系列的一个新版本,相比 YOLOv5 进行了大量的优化与改进。YOLOv6 的设计目标是在提高模型检测精度的同时,进一步优化速度和效率,特别是在推理速度和部署便捷性方面。它采用了更先进的网络架构和优化技巧,在…...

Java面向对象与多态

目录 Java面向对象与多态 多态介绍 形成多态的前提 多态下成员访问的特点 成员变量 成员方法 访问特点总结 多态对比普通继承 普通继承优点与缺点 多态优点与缺点 向上转型与向下转型 向下转型存在的问题 多态接口练习 Java面向对象与多态 多态介绍 在前面学习到…...

redis分布式锁和lua脚本

业务场景:多个线程对共同资源的访问:库存超卖/用户重复下单的原因 解决方法一:利用jvm内置锁,将非原子性操作变成原子性操作 Synchronized锁的是对象,对象必须是单例的。锁的是this,代表当前所在的类,这个…...

项目实战 ---- 商用落地视频搜索系统(5)---service层核心

目录 背景 向下service 层 描述 功能 代码实现 核心阐述 向上service层 描述 功能 代码实现 核心阐述 背景 之前的 1-4 重点在介绍系统的实现架构,录入数据的组织形式,存储模式,search 方式,以及后期算法等。重点都是聚焦在后端。现在来看,基本的后端实现我们…...

Win32远线程注入

远线程注入 远线程(RemoteThread)注入是指一个进程在另一个进程中创建线程的技术,这是一种很经典的DLL注入技术。 虽然比较古老,但是很实用。通过远线程注入,再配合api函数的hook技术,可以实现很多有意思的功能。 实现远线程注入…...

CTF 竞赛密码学方向学习路径规划

目录 计算机科学基础计算机科学概念的引入、兴趣的引导开发环境的配置与常用工具的安装Watt Toolkit(Steam)、机场代理Scoop(Windows 用户可选)常用 Python 库SageMathLinux小工具 yafuOpenSSL Markdown编程基础Python其他编程语言…...

2024数学建模国赛B题代码

B题已经完成模型代码!详情查看文末名片 问题1:可以考虑使用统计学中的“样本量估算”方法,使用二项分布或正态近似来决定最少的样本量,并通过假设检验(如单侧检验)在95%和90%置信度下进行判断。 import n…...

PyTorch 卷积层详解

PyTorch 卷积层详解 卷积层(Convolutional Layers)是深度学习中用于提取输入数据特征的重要组件,特别适用于处理图像和序列数据。PyTorch 提供了多种卷积层,分别适用于不同维度的数据。本文将详细介绍这些卷积层,特别…...

【Kubernetes知识点问答题】kubernetes 控制器

目录 1. 说明 K8s 控制器的作用? 2. 什么是 ReplicaSet,说明它的主要用途。 3. Deployment 控制器是如何工作的,举例说明其常见用途。 4. 解释 DaemonSet,列举其使用场景。 5. 什么是 StatefulSet,其主要作用是什么…...

Patlibc———更快捷的更换libc

起初是为了简化做pwn题目时,来回更换libc的麻烦,为了简化命令,弄了一个小脚本,可以加入到/usr/local/bin中,当作一个快捷指令🔢 这个写在了tools库(git clone https://github.com/CH13hh/tools…...

基于飞腾平台的Hive的安装配置

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…...

c# json使用

安装包 用NuGet安装包:Newtonsoft.Json 对象转为Json字符串 public class Person {public string Name { get; set; }public int Age { get; set; } }Person person new Person { Name "John Doe", Age 30 }; string json2 JsonConvert.SerializeO…...

单点登录:cas单点登录实现原理浅析

cas单点登录实现原理浅析 一晃几个月没写博客了,今年多灾多难的一年。 安能摧眉折腰事权贵,使我不得开心颜! 财富是对认知的补偿,不是对勤奋的嘉奖。勤奋只能解决温饱,要挣到钱就得预知风口,或者有独到见解…...

java报错

java.lang.RuntimeException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.tengzhi.base.model.E_xt_xmda...

uniapp动态页面API

目录 uni.setNavigationBarTitle动态设置标题 uni.showNavigationBarLoading为标题添加加载动画与uni.hideNavigationBarLoading停止加载动画 ​编辑 uni.setNavigationBarColor用于设置导航栏的颜色,包括背景颜色和文字颜色。这对于自定义应用的主题和风格非常有…...

最优化方法Python计算:求解约束优化问题的拉格朗日乘子算法

从仅有等式约束的问题入手。设优化问题(7.8) { minimize f ( x ) s.t. h ( x ) o ( 1 ) \begin{cases} \text{minimize}\quad\quad f(\boldsymbol{x})\\ \text{s.t.}\quad\quad\quad \boldsymbol{h}(\boldsymbol{x})\boldsymbol{o} \end{cases}\quad\quad(1) {minimizef(x)s.…...

每日OJ_牛客_骆驼命名法(递归深搜)

目录 牛客_骆驼命名法(简单模拟) 解析代码 牛客_骆驼命名法(简单模拟) 骆驼命名法__牛客网 解析代码 首先一个字符一个字符的读取内容: 遇到 _ 就直接跳过。如果上一个字符是 _ 则下一个字符转大写字母。 #inclu…...

MySQL 数据库管理与操作指南

文章目录 MySQL 数据库管理与操作指南1. 忘记 MySQL 密码的处理方法2. MySQL 数据库备份与恢复2.1 数据库备份2.2 数据库恢复 3. MySQL 用户与权限管理3.1 创建用户与授权3.2 查看所有用户3.3 删除用户 4. 关闭 GTID 复制模式5. 查看数据表的存储引擎5.1 查看 MySQL 支持的存储…...

PvZ Toolkit完整指南:植物大战僵尸修改器的终极解决方案

PvZ Toolkit完整指南:植物大战僵尸修改器的终极解决方案 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 你是否厌倦了在植物大战僵尸中重复刷资源?是否想体验游戏的全部乐趣…...

ExtractorSharp:突破游戏资源编辑壁垒,打造个性化补丁的全能工具

ExtractorSharp:突破游戏资源编辑壁垒,打造个性化补丁的全能工具 【免费下载链接】ExtractorSharp Game Resources Editor 项目地址: https://gitcode.com/gh_mirrors/ex/ExtractorSharp 你是否曾因找不到合适工具而放弃定制游戏角色外观&#xf…...

未来金融的三大走向

1. 智能化加速AI已从辅助决策走向自主交易,量化策略、智能投顾将覆盖更多普通投资者。不懂代码,也能用自然语言下达投资指令。 2. 资产代币化现实世界资产(RWA)上链成为新趋势。房产、债券、甚至艺术品,都可以分割成数…...

用快马AI快速原型:30分钟搭建养龙虾智能养殖管理系统

用快马AI快速原型:30分钟搭建养龙虾智能养殖管理系统 养龙虾作为现代农业养殖项目,管理流程的数字化能显著提升养殖效率。最近我用InsCode(快马)平台快速搭建了一个智能养殖管理系统原型,整个过程比想象中简单很多。下面分享我的实现思路和关…...

React Native测试配置终极指南:Jest与React Testing Library完整实战

React Native测试配置终极指南:Jest与React Testing Library完整实战 【免费下载链接】react-native-boilerplate A React Native template for building solid applications 🐙, using JavaScript 💛 or Typescript 💙 (you choo…...

终极指南:Android AdvancedRecyclerView 低版本兼容处理与 API 14+适配方案

终极指南:Android AdvancedRecyclerView 低版本兼容处理与 API 14适配方案 【免费下载链接】android-advancedrecyclerview RecyclerView extension library which provides advanced features. (ex. Googles Inbox app like swiping, Play Music app like drag and…...

为什么你的ranges::filter_view在C++27中突然崩溃?——深度逆向Clang 18.1.8 ABI变更引发的迭代器失效链

第一章:C27范围库扩展演进与ABI稳定性危机C27正以前所未有的力度重构范围(Ranges)库,引入std::ranges::zip_view的标准化、std::ranges::cartesian_product视图、以及支持异构比较的std::ranges::sort重载。这些增强显著提升了表达…...

网站纠错页面对 SEO 有什么作用_网站图片和视频优化对 SEO 有什么技巧

网站纠错页面对 SEO 有什么作用 在网站管理和搜索引擎优化(SEO)方面,纠错页面的作用常常被忽视。网站纠错页面实际上对 SEO 有着重要的影响。当用户访问一个网站时,如果遇到 404 错误(页面未找到)或其他错…...

GLM-4.1V-9B-Base实战教程:批量图片队列处理与异步结果回调机制实现

GLM-4.1V-9B-Base实战教程:批量图片队列处理与异步结果回调机制实现 1. 引言 在实际业务场景中,我们经常需要处理大量图片的分析任务。GLM-4.1V-9B-Base作为一款强大的视觉多模态理解模型,虽然提供了便捷的Web界面,但面对批量图…...

Qwen3.5-9B生产环境实践:高并发请求处理+响应延迟优化策略

Qwen3.5-9B生产环境实践:高并发请求处理响应延迟优化策略 1. 项目概述与核心能力 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在多个领域展现出卓越的性能。这个模型特别适合需要处理复杂任务的生产环境,因为它具备以下核心能力&#x…...