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

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

 工厂模式:设计模式--工厂模式-CSDN博客

策略模式:设计模式--策略模式-CSDN博客

如果想具体了解工厂模式和策略模式,请移步上述博客~ 


工厂模式与策略模式是两种常见的设计模式,这两种设计模式有几点较相似:

  • 封装性

    • 工厂模式:封装了对象的创建过程,客户端只需与工厂交互,而不需了解具体的类。
    • 策略模式:封装了算法或行为的实现,客户端通过上下文对象使用策略,但不需了解具体的策略实现细节。
  • 解耦

    • 工厂模式:通过工厂方法解耦了对象的创建与使用,客户端不需要知道具体的类,只需知道工厂接口。
    • 策略模式:通过策略接口解耦了算法的使用与具体实现,客户端可以通过上下文对象使用不同的策略而无需了解具体的算法。
  • 可扩展性

    • 工厂模式:添加新的产品只需扩展工厂类或工厂方法,而不需要修改客户端代码。
    • 策略模式:添加新的策略只需实现策略接口并在上下文中使用新的策略,而不需要修改客户端代码。

虽然工厂模式和策略模式是两种常见的设计模式,但是它们在设计目的和使用方式上有明显的区别。

1. 目的

  • 工厂模式:创建型模式,主要目的是创建对象。它通过工厂方法或工厂类来封装对象的创建过程,使得客户端代码可以在不需要知道具体类的情况下创建对象。工厂模式关注的是如何创建对象,而不是对象的行为。

  • 策略模式:行为型模式,主要目的是定义一系列算法或行为,并将每一个算法或行为封装在一个独立的策略类中,使得算法可以相互替换。策略模式关注的是算法或行为的选择和切换,而不是对象的创建。

2. 结构

  • 工厂模式

    • 简单工厂模式:一个工厂类根据提供的信息决定创建哪个具体产品类的实例。
    • 工厂方法模式:定义一个创建对象的接口,由子类决定实例化哪个具体类。工厂方法模式通过子类化来创建对象。
    • 抽象工厂模式:提供一个接口,用于创建一系列相关或依赖的对象,而无需指定具体类。
  • 策略模式

    • 策略接口:定义一个公共的算法接口。
    • 具体策略类:实现策略接口的具体算法。
    • 上下文:持有一个策略对象的引用,并调用策略对象的方法来完成某种功能。

3. 使用场景

  • 工厂模式:适用于需要创建多个实例且这些实例具有相同的接口但不同的实现时。例如,在构建系统中,根据配置文件动态创建不同类型的对象(如图形、数据库连接等)。

  • 策略模式:适用于需要在运行时动态选择算法或行为时。例如,根据不同的业务需求选择不同的折扣策略、排序算法等。

4. 实现

  • 工厂模式

    • 通过工厂类(或工厂方法)来创建对象。
    • 客户端代码不需要知道具体的类名,只需知道工厂的接口或方法即可。
    • 通过不同的工厂类或方法创建不同的具体产品对象。
  • 策略模式

    • 通过定义策略接口和多个具体策略类来实现。
    • 上下文类持有一个策略对象的引用,并委托策略对象执行具体的算法或行为。
    • 可以在运行时切换策略来改变算法的行为。

5.解决问题

  • 工厂模式:创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
  • 策略模式:是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。

工厂模式相当于黑盒子,策略模式相当于白盒子; 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 强化学习,第 5 部分:时间差异学习
  • 2、AI测试辅助-需求分析
  • 【数学建模】国赛论文写作教学——问题重述与分析
  • CST如何仿真Coverage Efficiency和Coverage Threshold
  • 第15届蓝桥杯青少组Scratch初级组省赛真题试卷
  • Figma 替代品 Penpot 安装和使用教程
  • 【Python系列】Jinja2 模板引擎
  • PyTorch深度学习网络(二:CNN)
  • 袋鼠云《数据资产管理白皮书》重磅发布,提供数据资产管理新思路,激发数据资产新动能(附下载)
  • .net framework 4.8 开发windows系统服务
  • [HZNUCTF 2023 preliminary]ppppop
  • Android活动(activity)与服务(service)进行通信
  • Android Telephony | operator.alpha 运营商名称信息来源代码解读
  • DHU 函数 ACSII 码排序
  • 【STM32】RS485
  • $translatePartialLoader加载失败及解决方式
  • 4. 路由到控制器 - Laravel从零开始教程
  • Java程序员幽默爆笑锦集
  • Java的Interrupt与线程中断
  • Python3爬取英雄联盟英雄皮肤大图
  • Redis字符串类型内部编码剖析
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 安卓应用性能调试和优化经验分享
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 简单易用的leetcode开发测试工具(npm)
  • 老板让我十分钟上手nx-admin
  • 前端性能优化——回流与重绘
  • 前嗅ForeSpider教程:创建模板
  • 如何选择开源的机器学习框架?
  • 手写双向链表LinkedList的几个常用功能
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 昨天1024程序员节,我故意写了个死循环~
  • ​2020 年大前端技术趋势解读
  • ​Python 3 新特性:类型注解
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (+4)2.2UML建模图
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (待修改)PyG安装步骤
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十六)串口UART
  • (四)c52学习之旅-流水LED灯
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (自用)交互协议设计——protobuf序列化
  • .Net 6.0--通用帮助类--FileHelper
  • .NET 8 跨平台高性能边缘采集网关
  • .NET Framework 3.5安装教程
  • .net 流——流的类型体系简单介绍
  • .net 使用ajax控件后如何调用前端脚本
  • .NET精简框架的“无法找到资源程序集”异常释疑