策略模式与工厂模式的区别

《策略模式与工厂模式的区别》

策略模式(Strategy Pattern)工厂模式(Factory Pattern) 都是常见的设计模式,虽然它们在设计目标上有一些相似之处,如解耦代码、增强扩展性,但它们的应用场景和解决的问题却是不同的。下面从多个角度详细对比它们的区别:

可以通过这两篇文章详细了解两种模式的原理 策略模式 工厂模式

1. 设计意图(目的不同)

  • 策略模式
    • 设计意图:用于在运行时根据不同的场景或条件,动态选择算法或行为。它的主要目标是将算法或行为的变化与使用它的客户端代码解耦,提供一种可以互换的算法或行为实现机制。
    • 应用场景:当一个对象需要执行某种行为,并且行为有多种实现方式时,策略模式允许程序动态选择不同的策略(算法)来执行该行为。
  • 工厂模式
    • 设计意图:工厂模式的主要目的是创建对象,它将对象的创建过程封装起来,使得创建对象的细节与使用对象的客户端解耦。工厂模式通常用于对象的实例化过程较为复杂的场景。
    • 应用场景:工厂模式适用于客户端只关心对象的接口,不关心具体对象如何创建的场景。工厂通过提供接口或父类,动态生成实例化对象。

2. 使用场景不同

  • 策略模式
    • 使用场景:在策略模式中,多个行为或算法可以根据条件动态选择。它解决了在运行时选择不同算法或行为的需求。例如:支付系统中根据不同支付方式选择相应的支付策略。
  • 工厂模式
    • 使用场景:工厂模式的核心在于创建对象,通过工厂类或方法来决定生成哪种对象。例如:数据库连接池中,工厂模式可以用于创建和管理不同类型的数据库连接。

3. 类结构与参与角色

策略模式类结构

  • 参与角色

    1. 策略接口(Strategy):定义了一组可互换的算法或行为。
    2. 具体策略类(ConcreteStrategy):实现了策略接口,定义了具体的算法或行为。
    3. 上下文类(Context):持有策略接口,并负责在运行时选择并执行某个策略。

    类图

在这里插入图片描述

工厂模式类结构:

  • 参与角色
    1. 工厂接口(Factory):定义创建对象的方法,通常返回一个接口类型或抽象类。
    2. 具体工厂类(ConcreteFactory):实现工厂接口,负责创建具体的对象。
    3. 产品接口(Product):定义创建出来的对象的公共接口。
    4. 具体产品类(ConcreteProduct):实现了产品接口,表示具体的对象。
  • 类图

在这里插入图片描述

4. 行为与对象创建的区别

  • 策略模式:核心目的是封装算法或行为,即将不同的算法或行为封装在具体的策略类中。运行时可以根据需要选择不同的策略,但策略模式本身不涉及对象的创建过程。
    • 行为驱动:它关注的是如何执行某个行为,并根据环境动态选择该行为的实现。
  • 工厂模式:核心目的是封装对象的创建,即将对象的创建过程放在工厂中,而不在客户端显式地创建对象。工厂模式的重点在于创建对象的方式。
    • 对象驱动:它关注的是如何创建某个对象,并根据需求生成不同的对象实例。

5. 是否动态切换策略

  • 策略模式:支持在运行时动态切换策略。上下文类可以根据条件或用户输入动态设置不同的策略对象。
    • 例子:在支付系统中,用户选择不同的支付方式(支付宝、信用卡、微信),策略模式会动态选择对应的支付策略。
  • 工厂模式:一旦创建了对象,对象不会动态变化。工厂负责生成对象后,该对象的行为和特性不会再改变。
    • 例子:数据库连接池中,工厂模式根据数据库类型创建连接对象,但连接对象一旦创建,它的行为和特性不会动态变化。

6. 实际案例应用对比

策略模式应用案例
  • 支付系统:在支付系统中,根据用户选择的支付方式(如支付宝、微信、信用卡等),选择不同的支付策略来完成支付。
  • 压缩算法:在文件压缩系统中,用户可以选择不同的压缩算法(如 ZIP、RAR、7Z),策略模式可以动态选择不同的压缩策略。
工厂模式应用案例
  • 日志系统:在日志系统中,根据配置文件或运行时的环境选择使用文件日志、数据库日志或控制台日志。工厂模式负责根据配置创建不同类型的日志对象。
  • 数据库连接池:根据应用程序所使用的数据库(如 MySQL、PostgreSQL),通过工厂模式动态创建不同的数据库连接对象。

7. 优缺点对比

策略模式:

  • 优点
    1. 扩展性强:可以轻松添加新的策略类,而不影响已有代码,符合开闭原则。
    2. 代码简洁:避免了复杂的条件判断,通过选择不同的策略实现不同的行为。
    3. 可动态切换行为:允许在运行时选择不同的策略类,灵活应对多变的需求。
  • 缺点
    1. 增加类的数量:每种策略都需要一个具体类,增加了系统类的数量。
    2. 客户端需要了解策略:客户端需要了解并选择合适的策略,这对使用者提出了更高的要求。

工厂模式:

  • 优点
    1. 解耦对象创建过程:将对象的创建与使用分离,客户端不需要关心具体对象如何创建。
    2. 减少重复代码:避免了在多个地方创建对象的重复代码,统一管理对象的创建过程。
    3. 符合开闭原则:当添加新的对象时,可以通过扩展工厂类来实现,不影响已有代码。
  • 缺点
    1. 可能导致类膨胀:如果系统中有许多具体产品和工厂,可能导致类的数量急剧增加。
    2. 复杂性增加:虽然减少了客户端的复杂性,但工厂模式增加了系统的结构复杂性,尤其是工厂方法模式和抽象工厂模式。

8.总结:

  • 策略模式 侧重于封装算法或行为,并允许根据运行时条件动态选择不同的策略。它适用于需要在运行时根据场景动态切换行为的情况。
  • 工厂模式 侧重于创建对象,隐藏对象创建的复杂性,使得客户端只关心使用对象,而不需要关心如何创建对象。它适用于创建对象过程较为复杂的情况。
  • 示例总结
    • 如果你想在一个支付系统中动态选择支付方式,那么你应该使用 策略模式
    • 如果你在一个应用中需要根据数据库类型来生成不同的数据库连接对象,那么你应该使用 工厂模式

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

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

相关文章

基于单片机的智能小车的开发与设计

摘要:本文论述了基于 STC89C52 单片机的智能小车的开发与设计过程。该设计采用单片机、电机驱动及光电循迹等技术,保证小车在无人管理状态下,能按照预先设定的线路实现自动循迹功能。在电路结构设计中力求方便,可操作,…

文件操作

文件的由来:在程序中,之前每一个程序都是需要运行然后输入数据,当程序结束时输入的数据也随之消散,为了下一次运行时不再输入数据就有文件的由来,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据…

软件著作权登记所需要的材料

软件著作权登记所需材料全面解析 在当今数字化时代,软件著作权作为保护软件开发者智力劳动成果的重要法律手段,其登记过程显得尤为重要。 一、软件著作权登记申请表 首先,软件著作权登记需要提交的最基本材料是《软件著作权登记申请表》。这份…

照片写真记录摄影作品记录网站源码

完美适应iPad,平板,手机竖屏不支持lazy,横屏可以,但建议使用平板查看效果, 有服务器直接上传解压使用,环境nginxphp, 没有服务器也没关系,可以直接使用html

前端项目代码开发规范及工具配置

在项目开发中,良好的代码编写规范是项目组成的重要元素。本文将详细介绍在项目开发中如何集成相应的代码规范插件及使用方法。 项目规范及工具 集成 EditorConfig集成 Prettier1. 安装 Prettier2. 创建 Prettier 配置文件3. 配置 .prettierrc4. 使用 Prettier 集成 …

计算机毕业设计 基于Python的食品销售数据分析系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

LeetCode Hot100 C++ 哈希 1.两数之和

LeetCode Hot100 C 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按…

基于STM32的智能花盆控制系统设计-设计说明书设计

设计摘要: 随着人们对室内绿植的热爱与需求日益增长,智能花盆控制系统作为一种新兴的智能化管理方式,受到了广泛关注。本文旨在设计一种基于STM32的智能花盆控制系统,以实现对花盆的自动浇水、温湿度监测和光照控制等功能。 在硬…

Android轻量级RTSP服务使用场景分析和设计探讨

技术背景 好多开发者,对我们Android平台轻量级RTSP服务模块有些陌生,不知道这个模块具体适用于怎样的场景,有什么优缺点,实际上,我们的Android平台轻量级RTSP服务模块更适用于内网环境下、对并发要求不高的场景&#…

基于对数变换的图像美白增强,Matlab实现

博主简介:matlab图像处理(QQ:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于对数变换的图像美白增强,用matlab实现。 一、案例背景和算法介绍 这次案例是美白算法&…

大数据可视化-三元图

三元图是一种用于表示三种变量之间关系的可视化工具,常用于化学、材料科学和地质学等领域。它的特点是将三个变量的比例关系在一个等边三角形中展示,使得每个点的位置代表三个变量的相对比例。 1. 结构 三个角分别表示三个变量的最大值(通常…

爬虫 ----hook

目录 定义: 了解什么是hook? 举例 hook XHR请求 XMLHttpRequest 案例地址: Interceptors-拦截器 HOOK cookie操作 cookie 示范 常见的hook代码总结 1.Hook Cookie 2.Hook Header 3.Hook URL 4.Hook JSON.stringify 5.Hook JSON.parse 6.Ho…

蓝桥杯嵌入式的学习总结

一. 前言 嵌入式竞赛实训平台(CT117E-M4) 是北京国信长天科技有限公司设计,生产的一款 “ 蓝桥杯全国软件与信息技术专业人才大赛-嵌入式设计与开发科目 “ 专用竞赛平台,平台以STM32G431RBT6为主控芯片,预留扩展板接口,可为用户提…

conda环境下module ‘numba.types‘ has no attribute ‘Macro‘问题解决

1 问题描述 conda环境下运行数据处理&#xff0c;报出如下错误&#xff1a; Traceback (most recent call last):File "train_preprocess.py", line 13, in <module>import audioFile "/opt/service/lipsync/audio.py", line 1, in <module>…

橙子质量检测系统源码分享

橙子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

基于yolov5滑块识别破解(一)

由于内容较长&#xff0c;将分为两个部分来说明&#xff0c;本文讲解yolov5的部署与训练。 1.YOLOv5部署 云端部署&#xff08;训练&#xff09; 服务器创建 如果自己的显卡算力不是很好的&#xff0c;或者是核显电脑&#xff0c;可以租用算力&#xff0c;价格还行一块钱左右就…

知乎:从零开始做自动驾驶定位; 注释详解(二)

这个个系统整体分为: 数据预处理 前端里程计 后端优化 回环检测 显示模块。首先来看一下数据预处理节点做的所有事情&#xff1a; 数据预处理节点 根据知乎文章以及代码我们知道: 节点功能输入输出数据预处理1.接收各传感器信息2.传感器数据时间同步 3.点云运动畸变补偿 4.传…

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

【Qt网络编程】Tcp多线程并发服务器和客户端通信

目录 一、编写思路 1、服务器 &#xff08;1&#xff09;总体思路widget.c&#xff08;主线程&#xff09; &#xff08;2&#xff09;详细流程widget.c&#xff08;主线程&#xff09; &#xff08;1&#xff09;总体思路chat_thread.c&#xff08;处理聊天逻辑线程&…

SQL 多表联查

目录 1. 内联接&#xff08;INNER JOIN&#xff09; 2. 左外联接&#xff08;LEFT JOIN&#xff09; 3. 右外联接&#xff08;RIGHT JOIN&#xff09; 4. 全外联接&#xff08;FULL JOIN&#xff09; 5. 交叉联接&#xff08;CROSS JOIN&#xff09; 6. 自联接&#xff0…