策略模式+工厂模式(案例实践易懂版)

最近,可以说这2025年度,自己更文的次数都大大减少,主要最近大环境不景气,自己职业也受到波及,学习的东西也是因为AI而变得更多,

没办法,你不学,总有人会学,关于AI的我也准备出个专辑,相信绝对帮助到大家

额,好像说多了,言归正传,我们看一下今天的主题:策略模式+工厂模式

本文主要是为了让人懂并会用(哪怕你是一个小白,也能懂!!!)

那你说,我怎么还看不懂啊? 哈哈哈!你过来捶我

本文总纲:

文章目录

    • 场景描述:
    • 1.定义策略接口(核心)
    • 2.实现具体策略类(真正得出不同容量的)
    • 工厂模式统一创建策略对象
    • 最后总结

为了让大家能快速明白,我在这里直接以一个例子,带大家实战中理解,就不放那些一看就劝退的理论术语

这里我们就用罗总之前星巴克的点单(大杯,中杯)问题的实际场景,大白话解释策略模式结合工厂模式的应用

场景描述:

假设现在罗总来到星巴克点一杯咖啡,罗总需要选择 咖啡的杯子规格(超大杯,大杯,中杯),每种杯子规格对应不同的杯子容量

  • 超大杯 591mL 大杯473ML 中杯 354ML

为了灵活应比如罗总所说的杯容量,添加新杯规格容量,我们用策略模式封装不同的规格容量的处理逻辑,并用工厂模式创建这些逻辑对象

1.定义策略接口(核心)

我们定义一个CapacityStrategy接口,这个接口对于后面杯子规格容量策略都需要实现这个接口!

为什么?

因为策略模式的核心也是最重要的就是:定义一系列算法,并封装成独立的类,目的是为了他们之间可以相互替换

比如我买咖啡,我之前选的中杯,我和服务员说不要中杯了给我来个超大杯,这个中杯和超大杯是平等的策略,我就可以替换

//杯子容量策略接口
public interface CapacityStrategy{//不同容量计算方法double calculateCapacity();
}

2.实现具体策略类(真正得出不同容量的)

如上面所述的中杯,大杯,超大杯分别对应不同的策略类

换句话说:就是此类真正干活的,给出到底杯子规格是多少的,如大杯的容量

点过奶茶的都知道吧,你扫码奶茶小程序点餐页面的选择不同规格,其实就是用到了策略模式

好处: 灵活替换算法,代码解耦

超大杯策略

public VentiCapacityStrategy implements CapacityStrategy{@Overridepublic double calculateCapacity(){return 591.0;}
}

大杯策略

public JorumCapacityStrategy implements CapacityStrategy{@Overridepublic double calculateCapacity(){return 473.0;}
}

中杯策略

public MediumCapacityStrategy implements CapacityStrategy{@Overridepublic double calculateCapacity(){return 354.0;}
}

工厂模式统一创建策略对象

这一步,就是你在小程序上选择不同规格的容量如大杯还是中杯就行,不需要你关心后面大杯到底对应多少容量,这一块尤我们创建的工厂模式类来创建对应的策略对象,就是由后台自己指定对应的杯容量

好处:隐藏创建细节,统一的对象管理

//策略工厂
public class CapacityStrategyFactory{//根据不同容量创建返回对应的策略public static CapacityStrategy getStrategy(String capacityType){case "超大杯":return new VentiCapacityStrategy();case "大杯":return new JorumCapacityStrategy();case "中杯":return new MediumCapacityStrategy();default: throw new Exception("此规格暂不支持"+capacityType);}
}

最后一步,就是真正的操作实现,我点完选择的奶茶如大杯规格,就给我做出了大杯

public class Shopper{public static void main(String[] args){//小程序选择的规格容量String type="大杯";//通过工厂获取对应的容量策略对象  创建CapacityStrategy strategy=CapacityStrategyFactory.getStrategy(type);//计算对应的规格容量double amount=strategy.calculateCapacity();//System.out.println("您选择了"+type+",容量是:"+amount+"ml")}
}

最后总结

策略模式: 把变化的部分 (不同规格容量的计算逻辑) 封装成独立的类,目的是为了可以灵活的替换

工厂模式: 把对象的创建过程 封装起来,就是让客户只需要选择要什么就行,不需要知道怎么造

两者结合:既保证了代码的灵活性(策略可替换),又降低了客户端的复杂度(无需关心对象创建)

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

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

相关文章

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析

大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解snowNLP库实现中文情感分析 视频在线地址&…

大根堆,小根堆,双指针

码蹄集OJ-大约 #include<bits/stdc.h> using namespace std; priority_queue<int>max2,maxDel; priority_queue<int,vector<int>,std::greater<int>>min2,minDel; const int N1e51; int n,result0,a[N]; int main( ) {cin>>n;for(int i1…

RS485和Modbus

UART协议中&#xff0c;空闲状态为高电平&#xff0c;也就是1,R25和R27&#xff0c;485收发器特性MAX485 (美信)SSP485 (国产替代)AZRS3080 (安格)供电电压5V5V3.3V ~ 5.5V静态电流300μA (接收模式)120μA (接收模式)150μA (接收模式)传输速率2.5Mbps10Mbps20Mbps总线负载能力…

【Android】交叉编译faiss库 | 问题解决

目录 一 解决 FAISS 交叉编译到 Android 时的 BLAS/MKL 依赖问题 二 交叉编译faiss ■禁用 BLAS并交叉编译faiss ■使用 OpenBLAS 的 Android 移植版本并交叉编译faiss 三 报错处理 ■报错 ■SWIG 一 解决 FAISS 交叉编译到 Android 时的 BLAS/MKL 依赖问题

《使用 IDEA 部署 Docker 应用指南》

使用 IDEA 部署 Docker 应用的详细步骤 一、创建 Dockerfile 配置文件 在项目根目录下创建Dockerfile文件&#xff0c;配置内容如下&#xff1a; # 使用官方的OpenJDK镜像作为基础镜像 FROM openjdk:17-jdk-slim# 设置维护者信息(可选) LABEL maintainer"三木豪"# 设…

【Docker#3】Window 和 Linux 上 docker安装 相关知识

前置了解&#xff1a; X86 高并发&#xff1a;基于 x86 架构的处理器&#xff0c;在高负载下处理大量并发请求的能力。ARM &#xff1a;使用 ARM 架构处理器的移动设备&#xff0c;具有低功耗和高性能的特点。 操作系统&#xff1a; CentOS&#xff1a;基于 Red Hat Enterprise…

一次 POI 版本升级踩坑记录

前言 结论先行。 开发过程中由于可能涉及到二次开发&#xff0c;若原系统开发时间久远&#xff0c;没有达成一致规范设计&#xff0c;导致风格各异&#xff0c;确实满足当时开发场景&#xff0c;但增大了后续的更新的难度&#xff0c;容易出现俄罗斯套娃现象&#xff0c;新的更…

硬件设计学习DAY13——电源缓冲电路设计全解

每日更新教程&#xff0c;评论区答疑解惑&#xff0c;小白也能变大神&#xff01;" 目录 一.缓冲电路介绍 1.1缓冲电路的作用 1.2寄生参数的来源 1.3缓冲电路的类型 1.4常见缓冲电路设计 1.5设计原则 二.吸收与缓冲 2.1吸收与缓冲的核心作用 2.2电压尖峰与吸收措…

鸿蒙搜狐新闻如何在Native调用ArkTS方法

01前言鸿蒙作为一款新兴的智能操作系统&#xff0c;现在适配鸿蒙系统的应用越来越多&#xff0c;同时会面临三端兼容问题&#xff0c;如同一产品功能&#xff0c;需要维护iOS、Android、鸿蒙三端代码。拿文件上传、下载功能场景举例&#xff0c;同时要适配iOS、Android、鸿蒙三…

Java行为型模式---中介者模式

中介者模式基础概念中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是通过一个中介对象来封装一系列对象之间的交互&#xff0c;使各对象不需要显式地相互引用&#xff0c;从而降低耦合度&#xff0c;并可以独立地改变它们之间…

Python爬虫实战:研究Korean库相关技术

一、引言 1.1 研究背景与意义 随着韩流文化在全球的传播,韩语网页内容急剧增加。韩国在科技、娱乐等领域的信息具有重要研究价值。然而,韩语独特的黏着语特性(如助词体系、词尾变化)给信息处理带来挑战。传统爬虫缺乏对韩语语言特点的针对性处理,本研究旨在开发一套完整…

表单校验--数组各项独立校验

写需求时遇到一个这样的问题&#xff0c;就是校样项是多个的&#xff0c;但是其字段名称相同这时我们可以这样校验&#xff0c;注意字段之间的关联性<div v-for"(item,index) in formData.hospitalDoctorList" :key"item.key || index"><el-form-…

基于SpringBoot和leaflet-timeline-slider的历史叙事GIS展示-以哪吒2的海外国家上映安排为例

目录 前言 一、哪吒2的海外之路 1、海外征战历程 2、上映国家空间查询 二、后端接口的实现 1、模型层的实现 2、上映时间与国家 3、控制层的实现 三、基于leaflet-timeline-slider的前端实现 1、时间轴控件的引入及定义 2、时间轴绑定事件 3、成果展示 四、总结 前言…

tar 解压:Cannot change ownership to uid 1000, gid 1000: Operation not permitted

tar 解压 tar.gz 压缩包报错&#xff1a; # tar xzf $INPUT_FOLDER/archive.tar.gz -C /mnt/test-nas/[..] tar: xx.jpg: Cannot change ownership to uid 1000, gid 1000: Operation not permitted原因是用普通用户执行的解压缩脚本&#xff0c;用root用户执行tar解压缩&…

腾讯客户端开发面试真题分析

以下是针对腾讯客户端开发工程师面试问题的分类与高频问题分析&#xff08;基于​​105道问题&#xff0c;总出现次数118次​​&#xff09;。按技术领域整合为​​7大类别​​&#xff0c;按占比排序并精选高频问题标注优先级&#xff08;1-5&#x1f31f;&#xff09;&#x…

线上问题排查之【CPU飙高100%】

目录 案例 发现问题 排查问题 步骤一 步骤二 步骤三 案例 import java.util.concurrent.TimeUnit;/*** 简单写一个CPU飙高的案例*/ public class CpuLoadUp {// 这里定义了一个标识private volatile static int flag 0;public static void main(String[] args) {// 执行…

c语言 进阶 动态内存管理

动态内存管理1. 为什么存在动态内存分配2. 动态内存函数的介绍​2.1 malloc 和 freemalloc 函数free 函数2.2内存泄漏2.3 calloc2.4 realloc3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放一块…

Redis的五大基本数据类型

一、Redis基本知识与Redis键&#xff08;key&#xff09;常用操作命令。redis的默认端口6379。mysql默认端口号3306。 默认16个数据库&#xff0c;类似数组的下标从0开始&#xff0c;初始默认使用0号库。可以使用select index来切换数据库&#xff0c;如&#xff1a;select 1&a…

达梦数据库JSON_TABLE使用说明

在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;将 JSON 数据转换为表格形式可以使用内置的 JSON_TABLE 函数。以下是详细步骤和示例&#xff1a;1. 核心函数&#xff1a;JSON_TABLE JSON_TABLE 用于将 JSON 数据解析为关系表结构&#xff0c;支持从 JSON 对象…

A316-1926-V1 USB多路高清音频解码器模组技术解析

随着数字音频技术的不断发展&#xff0c;高品质音频解决方案的需求日益增长。本文将介绍一款基于XMOS技术的高性能USB音频解码器模组——A316-1926-V1&#xff0c;这是一款专为高清音频应用设计的专业模组。核心技术与特性A316-1926-V1是一款集成了多项先进技术的USB多路高清音…