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

简单工厂模式和策略模式的异同

文章目录

  • 简单工厂模式和策略模式的异同
    • 相同点:
    • 不同点:
      • 目的:
      • 结构:
  • C++ 代码示例
    • 简单工厂模式示例(以创建图形对象为例)
    • 策略模式示例(以计算价格折扣策略为例)
      • UML区别

简单工厂模式和策略模式的异同

相同点:

都涉及到对象的创建和使用。在简单工厂模式中,工厂类负责创建对象;在策略模式中,虽然重点是算法的封装和切换,但具体策略类也是对象,需要被创建。
都有助于提高代码的可维护性和可扩展性。简单工厂模式将对象创建逻辑集中在工厂类中,方便添加新的产品对象;策略模式将不同的算法封装在具体策略类中,便于添加新的策略。

不同点:

目的:

简单工厂模式主要用于创建对象,它将对象的创建和使用分离。例如,在一个游戏道具系统中,简单工厂模式可以用来创建不同类型的道具,如武器、防具等。
策略模式侧重于在运行时切换算法或行为。例如,在游戏角色的攻击行为中,可以有不同的攻击策略,如近战攻击、远程攻击等,根据游戏场景和角色状态来切换。

结构:

简单工厂模式通常有一个工厂类,包含一个创建对象的方法,根据传入的参数返回不同类型的产品对象。
策略模式包含一个策略接口、多个具体策略类和一个上下文类。策略接口定义了算法方法,具体策略类实现这些方法,上下文类持有策略接口引用,用于调用具体策略类的算法。

C++ 代码示例

简单工厂模式示例(以创建图形对象为例)

// 抽象图形类
class Shape{
public:virtual void draw() = 0;
};// 具体图形类 - 圆形
class Circle : public Shape 
{
public:void draw() override{std::cout << "Drawing a circle." << std::endl;}
};// 具体图形类 - 矩形
class Rectangle : public Shape
{
public:void draw() override {std::cout << "Drawing a rectangle." << std::endl;}
};// 简单工厂类
class ShapeFactory 
{
public:static Shape* createShape(const std::string& shapeType){if (shapeType == "circle") {return new Circle();}else if (shapeType == "rectangle") {return new Rectangle();}return nullptr;}
};int main() 
{Shape* circle = ShapeFactory::createShape("circle");circle->draw();Shape* rectangle = ShapeFactory::createShape("rectangle");rectangle->draw();delete circle;delete rectangle;return 0;
}

策略模式示例(以计算价格折扣策略为例)

// 折扣策略接口
class DiscountStrategy
{
public:virtual double calculateDiscount(double price) = 0;
};// 具体折扣策略类 - 满减折扣
class FullReductionDiscount : public DiscountStrategy 
{
public:double calculateDiscount(double price) override {if (price >= 100) {return 20;}return 0;}
};// 具体折扣策略类 - 会员折扣
class MemberDiscount : public DiscountStrategy 
{
public:double calculateDiscount(double price) override {return price * 0.1;}
};// 上下文类
class PriceContext 
{
private:DiscountStrategy* discountStrategy;
public:PriceContext(DiscountStrategy* strategy) : discountStrategy(strategy) {}double calculateFinalPrice(double price) {double discount = discountStrategy->calculateDiscount(price);return price - discount;}
};int main() 
{FullReductionDiscount fullReduction;PriceContext fullReductionContext(&fullReduction);double price1 = fullReductionContext.calculateFinalPrice(120);std::cout << "Final price after full - reduction discount: " << price1 << std::endl;MemberDiscount memberDiscount;PriceContext memberDiscountContext(&memberDiscount);double price2 = memberDiscountContext.calculateFinalPrice(80);std::cout << "Final price after member discount: " << price2 << std::endl;return 0;
}

在上述代码中:
简单工厂模式的代码通过ShapeFactory创建不同类型的Shape对象(Circle和Rectangle)。工厂类的createShape方法根据传入的字符串参数决定创建哪种具体的图形对象。
策略模式的代码定义了DiscountStrategy接口,有FullReductionDiscount和MemberDiscount两个具体策略类实现了不同的折扣计算方法。PriceContext作为上下文类,根据传入的折扣策略对象来计算最终价格,通过这种方式可以在运行时灵活切换折扣策略。

UML区别

在这里插入图片描述
在这里插入图片描述

相关文章:

简单工厂模式和策略模式的异同

文章目录 简单工厂模式和策略模式的异同相同点&#xff1a;不同点&#xff1a;目的&#xff1a;结构&#xff1a; C 代码示例简单工厂模式示例&#xff08;以创建图形对象为例&#xff09;策略模式示例&#xff08;以计算价格折扣策略为例&#xff09;UML区别 简单工厂模式和策…...

HuggingFace datasets - 下载数据

文章目录 下载数据修改默认保存地址 TRANSFORMERS_CACHE保存到本地 & 本地加载保存加载 读取 .arrow 数据 下载数据 1、Python 代码下载 from datasets import load_dataset imdb load_dataset("imdb") # name参数为full或mini&#xff0c;full表示下载全部数…...

梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语

雅各比矩阵与梯度&#xff1a;区别与联系 在数学与机器学习中&#xff0c;梯度&#xff08;Gradient&#xff09; 和 雅各比矩阵&#xff08;Jacobian Matrix&#xff09; 是两个核心概念。虽然它们都描述了函数的变化率&#xff0c;但应用场景和具体形式有所不同。本文将通过…...

Vscode搭建C语言多文件开发环境

一、文章内容简介 本文介绍了 “Vscode搭建C语言多文件开发环境”需要用到的软件&#xff0c;以及vscode必备插件&#xff0c;最后多文件编译时tasks.json文件和launch.json文件的配置。即目录顺序。由于内容较多&#xff0c;建议大家在阅读时使用电脑阅读&#xff0c;按照目录…...

自定义 C++ 编译器的调用与管理

在 C 项目中&#xff0c;常常需要自动化地管理编译流程&#xff0c;例如使用 MinGW 或 Visual Studio 编译器进行代码的编译和链接。为了方便管理不同编译器和简化编译流程&#xff0c;我们开发了一个 CompilerManager 类&#xff0c;用于抽象编译器的查找、命令生成以及执行。…...

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…...

用SparkSQL和PySpark完成按时间字段顺序将字符串字段中的值组合在一起分组显示

用SparkSQL和PySpark完成以下数据转换。 源数据&#xff1a; userid,page_name,visit_time 1,A,2021-2-1 2,B,2024-1-1 1,C,2020-5-4 2,D,2028-9-1 目的数据&#xff1a; user_id,page_name_path 1,C->A 2,B->D PySpark&#xff1a; from pyspark.sql import SparkSes…...

Sentinel 学习笔记3-责任链与工作流程

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;原文地址如下&#xff1a; https://blog.csdn.net/baidu_28523317/category_10400605.html 上一篇梳理了概念与核心类&#xff1a;Sentinel 学习笔记2- 概念与核心类介绍-CSDN博客 补一个点&#xff1a;…...

Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)

效果预览 第一步&#xff1a; 告诉chatgpt&#xff1a; 将latex格式中的英文翻译为中文&#xff08;符号和公式不要动&#xff09;,给出latex格式第二步&#xff1a; Latex 转换为 Word&#xff08;使用GrindEQ &#xff09; 视频 https://www.bilibili.com/video/BV1f242…...

使用Chat-LangChain模块创建一个与用户交流的机器人

当然&#xff01;要使用Chat-LangChain模块创建一个与用户交流的机器人&#xff0c;你需要安装并配置一些Python库。以下是一个基本的步骤指南和示例代码&#xff0c;帮助你快速上手。 安装依赖库 首先&#xff0c;你需要安装langchain库&#xff0c;它是一个高级框架&#x…...

国家认可的人工智能从业人员证书如何报考?

一、证书出台背景 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新驱动发展战略&#xff0c;加强全国数字化人才队伍建设&#xff0c;持续推…...

【网络云计算】2024第51周-每日【2024/12/17】小测-理论-解析

文章目录 1. 计算机网络有哪些分类2. 计算机网络中协议与标准的区别3. 计算机网络拓扑有哪些结构4. 常用的网络设备有哪些&#xff0c;分属于OSI的哪一层5. IEEE802局域网标准有哪些 【网络云计算】2024第51周-每日【2024/12/17】小测-理论-解析 1. 计算机网络有哪些分类 计算…...

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果&#xff0c;它们在底层是怎样做的&#xff1f; 2.Spring给我们提供了很多扩展点&#xff0c;这些有了解吗&#xff1f; 3.MVC分层介绍一下&#xff1f; 4.了解SpringMVC的处理流程吗&#xff1f; 5.Handlermapping 和 handleradapter有…...

网络方案设计

一、网络方案设计目标 企业网络系统的构成 应用软件 计算平台 物理网络及拓扑结构 网络软件及工具软件 网络互连设备 广域网连接 无论是复杂的&#xff0c;还是简单的计算机网络&#xff0c;都包括了以下几个基本元素 &#xff1a; 应用软件----支持用户完成专门操作的软件。…...

学习记录:electron主进程与渲染进程直接的通信示例【开箱即用】

electron主进程与渲染进程直接的通信示例 1. 背景&#xff1a; electronvue实现桌面应用开发 2.异步模式 2.1使用.send 和.on的方式 preload.js中代码示例&#xff1a; const { contextBridge, ipcRenderer} require(electron);// 暴露通信接口 contextBridge.exposeInMa…...

【Java数据结构】ArrayList类

List接口 List是一个接口&#xff0c;它继承Collection接口&#xff0c;Collection接口中的一些常用方法 List也有一些常用的方法。List是一个接口&#xff0c;它并不能直接实例化&#xff0c;ArrayList和LinkedList都实现了List接口&#xff0c;它们的常用方法都很相似。 Ar…...

HDR视频技术之十:MPEG 及 VCEG 的 HDR 编码优化

与传统标准动态范围&#xff08; SDR&#xff09;视频相比&#xff0c;高动态范围&#xff08; HDR&#xff09;视频由于比特深度的增加提供了更加丰富的亮区细节和暗区细节。最新的显示技术通过清晰地再现 HDR 视频内容使得为用户提供身临其境的观看体验成为可能。面对目前日益…...

71 mysql 中 insert into ... on duplicate key update ... 的实现

前言 这个也是我们经常可能会使用到的相关的特殊语句 当插入数据存在 唯一索引 或者 主键索引 相关约束的时候, 如果存在 约束冲突, 则更新目标记录 这个处理是类似于 逻辑上的 save 操作 insert into tz_test_02 (field1, field2) values (field11, 11) on duplicate …...

计算机网络-GRE Over IPSec实验

一、概述 前情回顾&#xff1a;上次基于IPsec VPN的主模式进行了基础实验&#xff0c;但是很多高级特性没有涉及&#xff0c;如ike v2、不同传输模式、DPD检测、路由方式引入路由、野蛮模式等等&#xff0c;以后继续学习吧。 前面我们已经学习了GRE可以基于隧道口实现分支互联&…...

你的第一个博客-第一弹

使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架&#xff0c;适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统&#xff0c;支持用户注册、登录、发布文章等功能。 步骤&#xff1a; 安装 Flask 和其他必要库&#xff1a; 在开发博客之前&#xff0c;首…...

【更新 v 2.7.5 版本】桌面版 Open Claw 本地一键部署指南

✨ 核心亮点 零代码门槛&#xff5c;全程可视化&#xff5c;无需手动配环境&#xff5c;内置所有依赖&#xff5c;28 万 Tokens 额度 &#x1f517; 下载地址 https://xiake.yun/api/download/package/16?promoCodeIV8E496E2F7A &#x1f4dd; 前言 开源圈热门的「数字员…...

AMD Ryzen SMU调试工具终极指南:3步掌握硬件级性能调优

AMD Ryzen SMU调试工具终极指南&#xff1a;3步掌握硬件级性能调优 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…...

5个简单步骤掌握GanttProject:免费开源的项目管理工具终极指南

5个简单步骤掌握GanttProject&#xff1a;免费开源的项目管理工具终极指南 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject GanttProject是一款功能强大的免费开源项目管理软件&#xff0c…...

酷安UWP桌面客户端:在Windows电脑上高效刷酷安的完整指南

酷安UWP桌面客户端&#xff1a;在Windows电脑上高效刷酷安的完整指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 还在为手机小屏幕刷酷安而感到眼睛酸痛吗&#xff1f;想在27寸大屏幕…...

为Hermes Agent配置自定义Provider并指向Taotoken聚合服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Hermes Agent配置自定义Provider并指向Taotoken聚合服务 Hermes Agent 是一个功能强大的智能体开发框架&#xff0c;它支持通过自…...

Git Bisect 实战:用二分法快速找到引入 Bug 的提交

前言 项目跑了一段时间以后&#xff0c;最麻烦的 Bug 往往不是一眼能看出来的语法错误&#xff0c;而是那种“之前明明是好的&#xff0c;现在突然坏了”的回归问题。 比如某个接口在上个月还能正常返回数据&#xff0c;最近发版后开始报错&#xff1b;某个页面之前可以打开&am…...

UE5.3导入FBX实战:如何完美保留Maya/Blender的复杂层级并一键设置碰撞?

UE5.3 FBX导入全流程&#xff1a;从Maya/Blender复杂层级到可交互蓝图的终极解决方案 当机械臂的每个关节都需要独立控制&#xff0c;当建筑群中的每扇门窗都要单独设置碰撞&#xff0c;当角色装备的每件武器都需绑定动画——这些正是三维内容创作者在UE5中处理复杂资产时的真实…...

终极指南:3步在电脑上免费畅玩PS4游戏的神器——shadPS4模拟器

终极指南&#xff1a;3步在电脑上免费畅玩PS4游戏的神器——shadPS4模拟器 【免费下载链接】shadPS4 PS4 emulator for Windows,Linux,MacOS 项目地址: https://gitcode.com/gh_mirrors/shad/shadPS4 还在为无法在电脑上体验PS4独占游戏而烦恼吗&#xff1f;shadPS4模拟…...

给新手的保姆级教程:在VMware里一步步装好Ubuntu Server 22.04 LTS(附静态IP和SSH配置)

虚拟化环境下的Ubuntu Server 22.04 LTS全流程部署指南 对于刚接触Linux服务器运维的新手而言&#xff0c;在虚拟化环境中搭建Ubuntu Server是一个理想的起点。不同于物理机安装&#xff0c;虚拟化平台提供了可重复、隔离的实验环境&#xff0c;让学习者能够大胆尝试而无需担心…...

Agent相关面试

Agent高频面试题1. 一分钟讲清楚 Agent 的定义Agent 是以大模型为推理大脑&#xff0c;具备感知、思考、规划、工具调用、记忆、执行迭代能力的智能体。不再是简单问答&#xff0c;而是能自主拆解复杂任务、自主选择工具、自主多轮推理、记忆上下文、闭环完成目标&#xff0c;可…...