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

news2024/9/28 11:40:14

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

策略模式(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.coloradmin.cn/o/2173359.html

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

相关文章

做中视频计划,哪里找素材?推荐几个热门中视频素材下载网站

在做中视频计划时,寻找合适的素材至关重要。抖音上那些热门的中视频素材都是从哪里下载的呢?以下五大高清素材库值得收藏,赶紧来看看吧! 蛙学网 蛙学网提供了百万级的中视频素材,质量高且是4K高清无水印,视…

crypt.h:No such file or directory 报错处理

crypt.h:No such file or directory 报错处理 前言:本文初编辑于2024年9月28日 CSDN主页:https://blog.csdn.net/rvdgdsva 博客园主页:https://www.cnblogs.com/hassle 博客园本文链接:https://www.cnblogs.com/has…

0基础学前端 day6 -- 搭建github pages静态网址

标题:如何通过 GitHub Pages 创建一个静态网站 GitHub Pages 是 GitHub 提供的一项免费服务,允许用户从 GitHub 仓库中托管静态网站。对于开发者和非开发者来说,这都是一个极其便利的工具,用于创建和发布个人博客、项目文档或作品…

[leetcode刷题]面试经典150题之9python哈希表详解(知识点+题合集)

为了方便理解哈希表,我们先从python中的字典讲起。 字典 (Dictionary) 字典是 Python 中一种内置的数据结构,它是一种 键值对(key-value pair)存储形式。每个键(key)都有一个对应的值(value&a…

100个Transformer面试题,附答案!收藏这一篇就够了!

前言 Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention mec…

力扣 简单 112.路径总和

文章目录 题目介绍题解 题目介绍 题解 class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// 只在最开始的时候判断树是否为空if (root null) {return false;}targetSum - root.val;if (root.left null && root.right null) { // root 是…

zookeeper 服务搭建(集群)

准备3台虚拟机,ip分别是: 192.168.10.75 192.168.10.76 192.168.10.77 准备3个节点 mkdir /usr/local/cluster cd /usr/local/cluster git clone https://gitee.com/starplatinum111/apache-zookeeper-3.5.9-bin.git 重命名文件夹 mv apache-zookeeper…

uniapp踩坑 tabbar页面数据刷新了但视图没有更新

问题描述: 有个uni-data-checkbox组件,两个选项:选项1和选项2(对应的value值分别为1和2),v-model绑定属性名为value 两个tabbar页面:tab1,tab2。 tab1页面有个逻辑是在onShow中刷新v…

【开源免费】基于SpringBoot+Vue.JS新闻推荐系统(JAVA毕业设计)

本文项目编号 T 056 ,文末自助获取源码 \color{red}{T056,文末自助获取源码} T056,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Docker官网新手入门教程:从零开始玩转容器

大家好,今天咱们来聊聊Docker这个时髦的容器技术。 什么是Docker? Docker就像是一个打包快递的师傅,它能把你的应用程序和它所依赖的一切打包成一个标准的容器。这个容器可以在任何安装了Docker引擎的机器上运行,而且不会受到底…

9.28今日错题解析(软考)

目录 前言面向对象技术——UML软件工程——软件能力成熟度模型(CMM)程序设计语言——编译 前言 这是用来记录我备考软考设计师的错题的,今天知识点为UML、软件能力成熟度模型(CMM)和编译,大部分错题摘自希…

Linux基础(三):安装CentOS7

1.分区设置 由于使用 GPT 的关系, 因此根本无须考虑主/延伸/逻辑分区的差异。CentOS 默认使用 LVM 的方式来管理你的文件系统。使用GPT进行分区: 开机管理程序( boot loader) 使用CentOS 7.x默认的grub2软件。 2.各种分区格式 …

Redis: 特点,优势,与其他产品的区别,版本演进,以及高并发原理

入门Redis概述 1 )选择Redis是因为其高性能 因为 Redis 它数据存储的机制是存在内存中的,减少了传统关系数据库的磁盘IO它是单线程的保证了原子性,它还提供了事务,锁等相关的机制 2 )Redis 环境安装配置 linux 或 d…

实现语音合成的三种方法:HTML5 Web Speech 、speak-tts、百度语音合成

1. 使用HTML5 Web Speech API 1.1 使用方法 window.speechSynthesis 是HTML5 Web Speech API的一部分,是浏览器原生提供的文本转语音功能。它允许开发者在网页上通过JavaScript调用,将文本转换为语音进行播放。 https://developer.mozilla.org/zh-CN/d…

Cocos Creator 剪裁精灵图片方法记录(7)

Cocos Creator 剪裁精灵图片方法记录 start 最近拿到一些图片资源,但是都需要自己手动切割。类似unity的话有专门点击精灵工具自动帮你切割了,但是目前没有找到cocos中有这种工具。所以记录一下相关方法、 解决方案-Photoshop 最好的方式就是直接用 …

计算机毕业设计 在线项目管理与任务分配系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

[Redis][集群][上]详细讲解

目录 0.前言1.基本概念2.数据分片算法0.前言1.哈希求余2.一致性哈希算法3.哈希槽分区算法(Redis使用) 0.前言 说明:该章节相关操作不需要记忆,理解流程和原理即可,用的时候能自主查到即可 1.基本概念 哨兵模式提高了系统的可用性&#xff0…

数据交易知多少?从零到一的数据交易指南

在数字经济浪潮汹涌的今天,数据已成为推动社会进步和经济发展的关键生产要素。从政府决策到企业运营,从城市管理到个人生活,数据的价值日益凸显。那么数据流通交易机制及公共数据在各个领域的应用你都知道吗? 一、数据要素 数字经…

OFDM通信系统发射端需要做ifftshift的原因分析

对频率为15Hz的正弦波信号进行FFT分析,并且直接画图,matlab代码如下: fs 100; % sampling frequency t 0:(1/fs):(10-1/fs); % time vector S cos(2*pi*15*t); n length(S); X fft(S); f (0:n-1)*(fs/n); %frequenc…

react 常用hooks封装--useReactive

概述 一种具备响应式的useState 我们知道用useState可以定义变量格式为: const [count, setCount] useState(0) 通过 setCount 来进行设置,count 来获取,使用这种方式才能够渲染视图 来看看正常的操作,像这样 let count 0;…