工厂模式-策略工厂模式 两者的区别

模拟支付分为 微信支付 ,支付宝支付,银联支付

1、工厂模式

(1)、支付枚举类
import lombok.Getter;/*** @author zwh* @date 2024/1/26*/
@Getter
public enum PayEnum {/*** 支付类型*/WX_PAY(1, "微信支付"),ALI_PAY(2, "支付宝支付"),UNION_PAY(3, "银联支付"),;private final Integer code;private final String message;PayEnum(Integer code, String message) {this.code = code;this.message = message;}/*** 检查支付编码** @param payCode 支付编码* @return boolean*/public static boolean checkPayCode(Integer payCode) {for (PayEnum payEnum : PayEnum.values()) {if (payEnum.getCode().equals(payCode)) {return true;}}return false;}
}

(2)、支付接口

如果需要额外设置属性,需要使用抽象类,但是这里的支付仅仅只用到支付方法,所以不需要使用抽象类

/*** @author zwh* @date 2024/1/26*/
public interface PayService {/*** 支付*/void goToPay();
}
(3)、支付方法
import org.springframework.stereotype.Service;/*** @author zwh* @date 2024/1/26*/
@Service
public class AliPayServiceImpl implements PayService {@Overridepublic void goToPay() {System.out.println("zfb");}
}
import org.springframework.stereotype.Service;/*** @author zwh* @date 2024/1/26*/
@Service
public class WxPayServiceImpl implements PayService {@Overridepublic void goToPay() {System.out.println("wx");}
}
import org.springframework.stereotype.Service;/*** @author zwh* @date 2024/1/26*/
@Service
public class UnionPayServiceImpl implements PayService {@Overridepublic void goToPay() {System.out.println("yl");}
}
(4)、支付工厂创建
import com.pay.payservice.PayEnum;
import org.springframework.stereotype.Component;/*** 支付工厂** @author zwh* @date 2024/1/26*/
@Component
public class PayFactory {public PayService getInstance(PayEnum payEnum) {PayService payService;switch (payEnum) {case WX_PAY -> {payService = new WxPayServiceImpl();break;}case ALI_PAY -> {payService = new AliPayServiceImpl();break;}case UNION_PAY -> {payService = new UnionPayServiceImpl();break;}default -> throw new RuntimeException("支付类型错误,支付失败!");}return payService;}
}

(5)、测试
@SpringBootTest
class PayServiceApplicationTests {@Testvoid contextLoads() {}@Testvoid payTest() {PayFactory payFactory = new PayFactory();System.out.println("简单工厂模式");PayService wxPayService = payFactory.getInstance(PayEnum.WX_PAY);wxPayService.goToPay();PayService aliPayService = payFactory.getInstance(PayEnum.ALI_PAY);aliPayService.goToPay();PayService unionPayService = payFactory.getInstance(PayEnum.UNION_PAY);unionPayService.goToPay();}
}

打印结果

简单工厂模式
wx
zfb
yl

2、策略模式和工厂模式组合

目的: 使用策略模式去掉冗余的if-else 或者switch

通用上面的PayEnum

(1)、支付工厂类

import com.pay.payservice.PayEnum;import java.util.HashMap;
import java.util.Map;/*** 工厂策略模式** @author zwh* @date 2024/1/26*/
public class PayFactoryStrategy {/*** 设置策略参数*/private static final Map<Integer, PayStrategyService> STRATEGY_MAP = new HashMap<>();public static PayStrategyService getInstance(Integer payCode) {if (STRATEGY_MAP.containsKey(payCode)) {return STRATEGY_MAP.get(payCode);}throw new RuntimeException("没有找到对应的支付策略,获取支付方法失败");}public static void register(Integer payCode, PayStrategyService payService) {boolean isContain = PayEnum.checkPayCode(payCode);if (isContain) {STRATEGY_MAP.put(payCode, payService);} else {throw new RuntimeException("没有找到对应的支付策略,注入失败");}}
}
(2)、支付接口
import org.springframework.beans.factory.InitializingBean;/*** @author zwh* @date 2024/1/26*/
public interface PayStrategyService extends InitializingBean {/*** 支付*/void goToPay();
}

这里继承了 InitializingBean 类的主要目的是在启动的时候把对象给注册进去

(3)、支付接口实现类
import com.pay.payservice.PayEnum;
import org.springframework.stereotype.Service;/*** @author zwh* @date 2024/1/26*/
@Service
public class WxPayStrategyServiceImpl implements PayStrategyService {@Overridepublic void goToPay() {System.out.println("策略工厂-微信支付");}@Overridepublic void afterPropertiesSet() throws Exception {PayFactoryStrategy.register(PayEnum.WX_PAY.getCode(), this);}
}
import com.pay.payservice.PayEnum;
import org.springframework.stereotype.Service;/*** @author zwh* @date 2024/1/26*/
@Service
public class AliPayStrategyServiceImpl implements PayStrategyService {@Overridepublic void goToPay() {System.out.println("工厂策略模式-支付宝支付");}@Overridepublic void afterPropertiesSet() throws Exception {PayFactoryStrategy.register(PayEnum.ALI_PAY.getCode(), this);}
}
import com.pay.payservice.PayEnum;
import org.springframework.stereotype.Service;/*** @author zwh* @date 2024/1/26*/
@Service
public class UnionPayStrategyServiceImpl implements PayStrategyService {@Overridepublic void goToPay() {System.out.println("策略工厂-银联支付");}@Overridepublic void afterPropertiesSet() throws Exception {PayFactoryStrategy.register(PayEnum.UNION_PAY.getCode(), this);}
}

(4)、测试
@SpringBootTest
class PayServiceApplicationTests {@Testvoid payStrategyTest() {System.out.println("策略工厂模式");PayStrategyService wxStrategyPay = PayFactoryStrategy.getInstance(PayEnum.WX_PAY.getCode());wxStrategyPay.goToPay();PayStrategyService aliStrategyPay = PayFactoryStrategy.getInstance(PayEnum.ALI_PAY.getCode());aliStrategyPay.goToPay();PayStrategyService unionStrategyPay = PayFactoryStrategy.getInstance(PayEnum.UNION_PAY.getCode());unionStrategyPay.goToPay();}}

返回结果

策略工厂模式
策略工厂-微信支付
工厂策略模式-支付宝支付
策略工厂-银联支付

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8优化策略:注意力涨点系列篇 | 一种轻量级的加强通道信息和空间信息提取能力的MLCA注意力

🚀🚀🚀本文改进:一种轻量级的加强通道信息和空间信息提取能力 MLCA注意力 🚀🚀🚀在YOLOv8中如何使用 1)作为注意力机制使用;2)与c2f结合使用; 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研…

PaddleOCR将自己训练的模型转换为openvino格式模型

1 训练模型 python train_steelseal_det.py2 checkpoints模型转换为inference 模型 加载配置文件ch_PP-OCRv4_det_student_steelseal.yml&#xff0c;从./output/ch_PP-OCRv4/best_model/目录下加载model模型&#xff0c;inference模型保存在./output/ch_PP-OCRv4/best_model…

机器学习 | 深入探索Numpy的高性能计算能力

目录 初识numpy numpy基本操作 数组的基本操作 ndarray运算 数组间运算 矩阵 初识numpy Numpy&#xff08;Numerical Python&#xff09;是一个开源的Python科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务&…

视频尺寸魔方:分层遮掩3D扩散模型在视频尺寸延展的应用

▐ 摘要 视频延展(Video Outpainting)是对视频的边界进行扩展的任务。与图像延展不同&#xff0c;视频延展需要考虑到填充区域的时序一致性&#xff0c;这使得问题更具挑战性。在本文中&#xff0c;我们介绍了一个新颖的基于扩散模型的视频尺寸延展方法——分层遮掩3D扩散模型(…

盛况空前 火热来袭 ▏2024上海国际轴承及其专用装备展览会暑期归来

中国设备管理协会主办的“2024上海国际轴承及其专用装备展览会”将于2024年7月24日至26日在“国家会展中心&#xff08;虹桥&#xff09;”举办。展会预计展出面积55000平方米&#xff0c;汇聚来自世界各地的近1000家企业与60000多人次的国内外观众齐聚一堂。为期三天的展览会是…

【力扣每日一题】力扣2846边权重均等查询

题目来源 力扣2846边权重均等查询 解题过程 思路一 刚开始看到这道题&#xff0c;注意到了是一个在树中找路径的问题&#xff0c;于是选择了把树当作图&#xff0c;来寻找两点之间的路径。&#xff08;这里使用了DFS来找路径&#xff09; 代码实现一 class Solution {pri…

五、RHCE--NFS服务器

五、RHCE--NFS服务器 1、简介2、nfs配置3、配置autofs自动挂载1、简介 NFS(Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。在NFS的…

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法 0.写在前面00.电脑配置01.思路 1.VisualSVN Server下载安装01.下载02.安装03.电脑命名不能有中文04.制作VisualSVN Server快捷方式05.License limits exceeded, Som…

二分图 染色法 + 匈牙利算法

染色法判断二分图 const int N 1e5 10, M 2 * N;int e[M], ne[M], h[N], n, m, idx 0, color[N]; void add(int a, int b){e[idx] b; ne[idx] h[a]; h[a] idx;}bool dfs(int u, int c) {color[u] c; // 染色该点for(int i h[u]; i ! -1; i ne[i]){int j …

仅用2天就备案完成了,这速度也太快了...

引言 大家好&#xff0c;就在前天&#xff0c;笔者才发布了文章《时隔78天&#xff0c;个人微信小游戏内容审核终于通过了&#xff0c;这到底是经历了什么…》。 感慨了游戏内容审核的不容易&#xff0c;同时简单介绍了备案的流程。 没想到申请备案才2天&#xff0c;就已经过…

如何对高并发系统进行压力测试?重要参数详解

前言 大家好&#xff0c;我是chowley&#xff0c;今天来介绍一下——高并发系统下的压力测试 本文将深入探讨如何对高并发系统进行压力测试&#xff0c;重点解析压力测试中的关键参数。 压力测试 在当今的软件开发领域中&#xff0c;高并发系统的性能至关重要的。为确保系统…

TongWeb8交流常见问答集

问题1&#xff1a;今后用到你们TongWeb产品该联系谁&#xff1f; 答复&#xff1a; 1. 商务问题&#xff0c;如&#xff1a;报价、license授权、合同等请联系销售。 2. TongWeb技术问题&#xff0c;未签项目联系售前&#xff0c;已签项目联系售后。有指定项目经理的项目&…

【EI会议征稿】第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024)

第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024) The 3rd International Conference on Bigdata Blockchain and Economy Management 第三届大数据、区块链与经济管理国际学术会议(ICBBEM 2024)&#xff0c;将于2024年3月22-24日在中国南昌召开。大会由江西科技师…

2023年衣物清洁赛道行业数据分析(电商数据查询):总销额同比下滑21%

衣物清洁产品是日常生活中的必备消费品&#xff0c;加之消费频次较高&#xff0c;因此在我国较大的人口基数背景下&#xff0c;衣物清洁市场的整体体量也比较大。不过&#xff0c;从年度的销售走势看&#xff0c;2023年衣物清洁市场的整体销售呈现一定幅度的下滑。 根据鲸参谋…

深入浅出 diffusion(2):pytorch 实现 diffusion 加噪过程

我在上篇博客深入浅出 diffusion&#xff08;1&#xff09;&#xff1a;白话 diffusion 原理&#xff08;无公式&#xff09;中介绍了 diffusion 的一些基本原理&#xff0c;其中谈到了 diffusion 的加噪过程&#xff0c;本文用pytorch 实现下到底是怎么加噪的。 import torch…

Oracle篇—分区表和分区索引的介绍和分类(第一篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

教培行业的手机软件应该有哪些功能

DT浏览器是一款面向教育行业的手机软件&#xff0c;主要有网络搜索、资料收藏&#xff08;可分类和排序&#xff0c;只有DT浏览器有这个功能&#xff09;、人工智能写作、人工智能知识问答、内部交流&#xff08;功能比某信强大&#xff0c;自己管理&#xff0c;自由度高&#…

shell监控目录下新增的文件并进行处理

用户每天上传文件到指定目录&#xff0c;通过shell脚本尽快识别到新上传的文件已经上传完成&#xff0c;然后就处理新上传的文件。 通过ls记录文件名列表到临时文件中&#xff0c;然后通过diff比较识别新增的文件&#xff1b; 通过文件的大小变化判断新增文件是否上传完成&…

金蝶云星空—开发直接SQL报表

项目场景&#xff1a; 金蝶云星空报表开发 问题描述 金蝶云星空直接SQL开发不需要些代码&#xff0c;只通过SQL脚本即可开发 解决方案&#xff1a; 步骤如下&#xff1a; 步骤一&#xff1a; 打开BOSS开发平台&#xff0c;打开 -》财务会计 -》总账 -》账表 -》直接SQL账表…

C语言的模型玩具:结构体的使用以及操作符优先级

各位少年&#xff0c;大家好&#xff0c;我是博主那一脸阳光&#xff0c;今天分享结构体的使用&#xff0c;声明以及操作符的使用。 前言&#xff1a; 如果你想做一块月饼&#xff0c;你要学习它的制作方法&#xff0c;需要准备面粉&#xff0c;白砂糖&#xff0c;奶粉&…