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

设计模式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基本标签实现“时空电影网”案例步骤及详细代码

根据您的需求&#xff0c;我为您实现了对“时空电影网”电影节页面的美化。以下是详细的步骤&#xff1a; 设置一级标题“电影节”文字的颜色&#xff1a;将一级标题的颜色设置为深蓝色&#xff08;#0000FF&#xff09;。 <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 中的一个指令&#xff0c;用于基于源数据多次渲染元素或模板块。它类似于 JavaScript 中的 for 循环。 基本语法 <template><div><!-- 基本列表渲染 --><ul><li v-for"item in items" :key"i…...

uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件

手机上有很多组件&#xff0c;需要手机底部弹窗来做选择,picker选择器&#xff0c;select列选择器呀这些&#xff0c;在苹果手机上会被底部nav遮住 采用了好几种配置的方式&#xff0c;多多少少都不太行&#xff0c;还是采用css来做吧&#xff0c;但是css来写想让它生效&#x…...

CentOS9 Stream上安装Edge浏览器

CentOS9 Stream上安装Edge浏览器 1. 下载 Microsoft Edge RPM 包2. 安装 Edge 浏览器3. 启动 Microsoft Edge4. 更新 Microsoft Edge&#xff08;可选&#xff09; 如果运行的时候出现错误&#xff1a;[5809:5809:1030/234136.530802:ERROR:zygote_host_impl_linux.cc(101)] Ru…...

el-datepicker此刻按钮点击失效

文章目录 此刻按钮失效原因&#xff1a;使用了禁用未来日期解决办法&#xff1a;重写此刻按钮点击事件代码&#xff08;包含禁用未来日期和时分秒的处理&#xff09;框出主要代码&#xff08;因为包含禁用日期功能&#xff09;&#xff08;取你所需&#xff09; 此刻按钮失效原…...

VUE组件学习 | 六、v-if, v-else-if, v-else组件

v-if、v-else-if 和 v-else 指令基础知识 在 Vue.js 中&#xff0c;v-if、v-else-if 和 v-else 是一组指令&#xff0c;用于根据表达式的值条件性地渲染元素。 基本语法 <template><div><!-- 基础条件渲染 --><h1 v-if"type A">类型 A&l…...

机器学习算法之回归算法

一、回归算法思维导图 二、算法概念、原理、应用场景和实例代码 1、线性回归 1.1、概念 ‌‌线性回归算法是一种统计分析方法&#xff0c;用于确定两种或两种以上变量之间的定量关系。‌ 线性回归算法通过建立线性方程来预测因变量&#xff08;y&#xff09;和一个或多个自变量…...

cordova android 内嵌vue页面 启动页之后白屏问题处理

困扰很久的问题 一直都用splash 做延迟加载 但在 一些android机器上还是会有 这短暂的白屏其实就是vue页面尚未完全渲染的间隙 处理方案 在html中添加 <body><div id"splash-screen" style"position: fixed; top: 0; left: 0; width: 100%; height: 1…...

自研小程序-心情追忆

在近期从繁忙的工作中暂时抽身之后&#xff0c;我决定利用这段宝贵的时间来保持我的Java技能不致生疏&#xff0c;并通过一个个人项目来探索人工智能的魅力。 我在Hugging Face&#xff08;国内镜像站点&#xff1a;HF-Mirror&#xff09;上发现了一个关于情感分析的练习项目&…...

【部署与升级-会议签到的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.新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;的比例可以通过特定的参数进行设置。2.这…...

系统学习CFD,常见收敛问题、及如何与机器学习相结合

一、如何系统学习CFD 系统学习计算流体力学&#xff08;CFD&#xff09;需要按照一定的步骤和层次进行&#xff0c;以下是一个学习路径的建议&#xff1a; 1.基础知识学习&#xff1a; 掌握流体力学的基本原理&#xff0c;包括流体静力学、流体动力学、流体控制方程等。 学习…...

REST架构与实现

一、REST 架构风格 基本概念 REST(Representational State Transfer),即表述性状态转移,是一种软件架构风格。它通过使用标准的 HTTP 方法操作网络上的资源来实现信息交互。在 REST 架构风格中,网络上的一切都被抽象成资源,例如,在一个在线购物系统中,商品、订单、用户…...

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球&#xff0c;企业对快速构建应用程序的需求愈发强烈。然而&#xff0c;传统的软件开发周期冗长、成本高昂&#xff0c;往往无法满足快速变化的市场需求。在此背景下&#xff0c;低代码平台逐渐成为开发者和企业的优选方案&#xff0c;以其“低…...

快速上手 Rust——环境配置与项目初始化

Rust 跨界&#xff1a;全面掌握跨平台应用开发 第一章&#xff1a;快速上手 Rust 1.1 环境配置与项目初始化 1.1.1 安装 Rust 和 Cargo 在开始学习 Rust 之前&#xff0c;首先需要安装 Rust 编程语言及其包管理工具 Cargo。Rust 的安装非常简单&#xff0c;使用官方的安装脚…...

分布式事务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将安装好的配置文件数据&#xff0c;拷贝一份到物理机 docker cp seata-serve:/seata-server/resources /User/…...

编程知识概览

编程&#xff0c;这个在现代社会中无处不在的词汇&#xff0c;已经从最初的计算机专业人士的专属技能&#xff0c;变成了许多人日常生活和工作中不可或缺的一部分。从简单的网页浏览、邮件发送&#xff0c;到复杂的游戏开发、数据分析&#xff0c;编程的应用几乎覆盖了所有领域…...

基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!

往期精彩内容&#xff1a; Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...