设计模式4-工厂模式策略模式
目录
一 工厂模式
1.1 思想
1.2 案例
1.2.1 接口
1.2.2 实现类
1.2.3 工厂类
1.2.4 调用
二 策略模式
2.1 思想
2.2 案例
2.2.1 接口
2.2.2 实现类
2.2.3 策略类
2.2.4 调用
三 工厂模式+策略模式
3.1 思想
3.2 案例
3.2.1 接口
3.2.2 实现类
3.2.3 定义Factory
3.2.4 调试
一 工厂模式
1.1 思想
* 1.定义一个接口
* 2.定义一个实现类
* 3.定义一个根据传入参数,产生对象的工厂类
* 4.通过工厂类调用具体对象的方法
1.2 案例
1.2.1 接口
public interface BankInfo {public void payMoney();
}
1.2.2 实现类
public class BocBank implements BankInfo{@Overridepublic void payMoney() {System.out.println("中国银行取钱50元");}
}
public class IcbcBank implements BankInfo{@Overridepublic void payMoney() {System.out.println("工商银行银行取钱50元");}
}
1.2.3 工厂类
public class ObjectFactory {public BankInfo buildObjectInfo(String str){if (str == null){return null;}else if ("boc".equals(str)) {return new BocBank();}else if ("icbc".equals(str)) {return new IcbcBank();}else {return null;}}
}
1.2.4 调用
/*** @ClassName: TestFt* @Description: TODO* @Author: admin* 1.定义一个接口* 2.定义一个实现类* 3.定义一个根据传入参数,产生对象的工厂类* 4.通过工厂类调用具体对象的方法*** @Date: 2024/08/01 20:56:05 * @Version: V1.0**/
public class TestFt {public static void main(String[] args) {ObjectFactory objectFactory = new ObjectFactory();BankInfo bankInfoBank = objectFactory.buildObjectInfo("icbc");bankInfoBank.payMoney();}
}
二 策略模式
2.1 思想
1.定义一个策略接口,在接口中声明一个行为方法
* 2.定义多个策略实现类,并实现策略接口,重写行为方法,实现各自逻辑
* 3.定义一个context上下文,用于调用具体的策略方法,供客户端使用;通过new context的构造函数传入策略对象,然后通过此对象调用策略行为方法。
2.2 案例
2.2.1 接口
public interface BankInfo {public void payMoney(int a,int b);
}
2.2.2 实现类
public class BocBank implements BankInfo{@Overridepublic void payMoney(int a,int b) {System.out.println("中国银行,累加:"+(a+b));}
}
public class IcbcBank implements BankInfo{@Overridepublic void payMoney(int a, int b) {System.out.println("中国工商银行,扣减:"+(a-b));}
}
2.2.3 策略类
public class StaragePattern {private BankInfo bankInfo;public StaragePattern(BankInfo bankInfo) {this. bankInfo = bankInfo;}public void contextInfo(int a,int b){bankInfo.payMoney(a,b);}
}
2.2.4 调用
/*** @ClassName: TestS* @Description: TODO* 1.定义一个策略接口,在接口中声明一个行为方法* 2.定义多个策略实现类,并实现策略接口,重写行为方法,实现各自逻辑* 3.定义一个context上下文,用于调用具体的策略方法,供客户端使用;通过new context的构造函数传入策略对象,然后通过此对象调用策略行为方法。* https://zhuanlan.zhihu.com/p/680317010* @Author: admin* @Date: 2024/08/02 11:28:34 * @Version: V1.0**/
public class TestS {public static void main(String[] args) {
// StaragePattern staragePattern = new StaragePattern(new BocBank());
// staragePattern.contextInfo(30,20);}
}
三 工厂模式+策略模式
3.1 思想
1.定义接口实现InitializingBean,重写 void afterPropertiesSet(),在服务启动时候,自动执行子类中的afterPropertiesSet()方法。
3.2 案例
3.2.1 接口
public interface HandlerStrategyFactory extends InitializingBean {void getCoca(String parameter);
}
3.2.2 实现类
@Component
public class CocaHandlerV2 implements HandlerStrategyFactory{@Overridepublic void getCoca(String parameter){System.out.println("我是可口可乐-策略+工厂 "+parameter);}@Overridepublic void afterPropertiesSet() throws Exception{//K //VFactory.register("Coca",this);}
}
@Component
public class PepsiHandlerV2 implements HandlerStrategyFactory{@Overridepublic void getCoca(String parameter){System.out.println("我是百事可乐-策略+工厂 "+parameter);}@Overridepublic void afterPropertiesSet() throws Exception{Factory.register("Pepsi",this);}
}
3.2.3 定义Factory
public class Factory {private static Map<String, HandlerStrategyFactory> strategyMap = new ConcurrentHashMap<>();public static HandlerStrategyFactory getInvokeStrategy(String str){return strategyMap.get(str);}public static void register(String str ,HandlerStrategyFactory handler){System.out.println("str: "+str+"\t handler: "+handler);if (null == str || null == handler){return;}strategyMap.put(str,handler);}
}
3.2.4 调试
@SpringBootTest
public class DesignPatternTest
{/*** 策略+工厂V2*/@Testpublic void methodV2(){String parameter = "Coca";HandlerStrategyFactory invokeStrategy = Factory.getInvokeStrategy(parameter);invokeStrategy.getCoca(parameter);}
}
结果图:

相关文章:
设计模式4-工厂模式策略模式
目录 一 工厂模式 1.1 思想 1.2 案例 1.2.1 接口 1.2.2 实现类 1.2.3 工厂类 1.2.4 调用 二 策略模式 2.1 思想 2.2 案例 2.2.1 接口 2.2.2 实现类 2.2.3 策略类 2.2.4 调用 三 工厂模式策略模式 3.1 思想 3.2 案例 3.2.1 接口 3.2.2 实现类 3.2.3 定义F…...
使用Html5基本标签实现“时空电影网”案例步骤及详细代码
根据您的需求,我为您实现了对“时空电影网”电影节页面的美化。以下是详细的步骤: 设置一级标题“电影节”文字的颜色:将一级标题的颜色设置为深蓝色(#0000FF)。 <h1><font color"darkblue">电…...
Servlet 3.0 新特性全解
文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…...
VUE组件学习 | 五、v-for组件
v-for 指令基础知识 v-for 是 Vue.js 中的一个指令,用于基于源数据多次渲染元素或模板块。它类似于 JavaScript 中的 for 循环。 基本语法 <template><div><!-- 基本列表渲染 --><ul><li v-for"item in items" :key"i…...
uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件
手机上有很多组件,需要手机底部弹窗来做选择,picker选择器,select列选择器呀这些,在苹果手机上会被底部nav遮住 采用了好几种配置的方式,多多少少都不太行,还是采用css来做吧,但是css来写想让它生效&#x…...
CentOS9 Stream上安装Edge浏览器
CentOS9 Stream上安装Edge浏览器 1. 下载 Microsoft Edge RPM 包2. 安装 Edge 浏览器3. 启动 Microsoft Edge4. 更新 Microsoft Edge(可选) 如果运行的时候出现错误:[5809:5809:1030/234136.530802:ERROR:zygote_host_impl_linux.cc(101)] Ru…...
el-datepicker此刻按钮点击失效
文章目录 此刻按钮失效原因:使用了禁用未来日期解决办法:重写此刻按钮点击事件代码(包含禁用未来日期和时分秒的处理)框出主要代码(因为包含禁用日期功能)(取你所需) 此刻按钮失效原…...
VUE组件学习 | 六、v-if, v-else-if, v-else组件
v-if、v-else-if 和 v-else 指令基础知识 在 Vue.js 中,v-if、v-else-if 和 v-else 是一组指令,用于根据表达式的值条件性地渲染元素。 基本语法 <template><div><!-- 基础条件渲染 --><h1 v-if"type A">类型 A&l…...
机器学习算法之回归算法
一、回归算法思维导图 二、算法概念、原理、应用场景和实例代码 1、线性回归 1.1、概念 线性回归算法是一种统计分析方法,用于确定两种或两种以上变量之间的定量关系。 线性回归算法通过建立线性方程来预测因变量(y)和一个或多个自变量…...
cordova android 内嵌vue页面 启动页之后白屏问题处理
困扰很久的问题 一直都用splash 做延迟加载 但在 一些android机器上还是会有 这短暂的白屏其实就是vue页面尚未完全渲染的间隙 处理方案 在html中添加 <body><div id"splash-screen" style"position: fixed; top: 0; left: 0; width: 100%; height: 1…...
自研小程序-心情追忆
在近期从繁忙的工作中暂时抽身之后,我决定利用这段宝贵的时间来保持我的Java技能不致生疏,并通过一个个人项目来探索人工智能的魅力。 我在Hugging Face(国内镜像站点:HF-Mirror)上发现了一个关于情感分析的练习项目&…...
【部署与升级-会议签到的web安装】
部署与升级-会议的远程安装 技术路线界面规划flaskAPI以及socketio.emit shellout浏览器和后端交互到处是偶遇 技术路线 运行的基础是Flask-Soketio, 并借鉴了后台运行系统指令的代码 和scrncpy项目,app安装的脚本 #mermaid-svg-8H9rbzbpgpnAXfA3 {font-family:"trebuche…...
【jvm】如何设置新生代和老年代的比例
目录 1. 说明2. 使用-XX:NewRatio参数3. 使用-Xmn参数4. 配置新生区中的Eden区和Survivor区比例5. 综合配置示例6. 注意事项 1. 说明 1.新生代(Young Generation)和老年代(Old Generation)的比例可以通过特定的参数进行设置。2.这…...
系统学习CFD,常见收敛问题、及如何与机器学习相结合
一、如何系统学习CFD 系统学习计算流体力学(CFD)需要按照一定的步骤和层次进行,以下是一个学习路径的建议: 1.基础知识学习: 掌握流体力学的基本原理,包括流体静力学、流体动力学、流体控制方程等。 学习…...
REST架构与实现
一、REST 架构风格 基本概念 REST(Representational State Transfer),即表述性状态转移,是一种软件架构风格。它通过使用标准的 HTTP 方法操作网络上的资源来实现信息交互。在 REST 架构风格中,网络上的一切都被抽象成资源,例如,在一个在线购物系统中,商品、订单、用户…...
AI驱动的低代码未来:加速应用开发的智能解决方案
引言 随着数字化转型的浪潮席卷全球,企业对快速构建应用程序的需求愈发强烈。然而,传统的软件开发周期冗长、成本高昂,往往无法满足快速变化的市场需求。在此背景下,低代码平台逐渐成为开发者和企业的优选方案,以其“低…...
快速上手 Rust——环境配置与项目初始化
Rust 跨界:全面掌握跨平台应用开发 第一章:快速上手 Rust 1.1 环境配置与项目初始化 1.1.1 安装 Rust 和 Cargo 在开始学习 Rust 之前,首先需要安装 Rust 编程语言及其包管理工具 Cargo。Rust 的安装非常简单,使用官方的安装脚…...
分布式事务Seata-AT模式
1. seata安装 docker 安装 docker run --name seata-server \-p 8091:8091 \-p 7091:7091 \-e SEATA_IP192.168.0.250 \-e SEATA_PORT8091 \seataio/seata-server将安装好的配置文件数据,拷贝一份到物理机 docker cp seata-serve:/seata-server/resources /User/…...
编程知识概览
编程,这个在现代社会中无处不在的词汇,已经从最初的计算机专业人士的专属技能,变成了许多人日常生活和工作中不可或缺的一部分。从简单的网页浏览、邮件发送,到复杂的游戏开发、数据分析,编程的应用几乎覆盖了所有领域…...
基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!
往期精彩内容: Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
