【设计模式】工厂模式与策略模式的区别

目录

1、工厂模式

2、策略模式

3、区别

3.1、工厂模式

1. 目的:

2. 使用场景:

3. 实现方式:

4. 示例:

3.2、策略模式

1. 目的:

2. 使用场景:

3. 实现方式:

4. 示例:

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

3.3、总结

4、案例

5、23种设计模式


在系统分析师考试中,无论是综合知识还是案例、论文,都会考到设计模式相关的知识点。

系统架构师考试在最新的改版后,已渐渐移除了设计模式的考点,改成中级必备

设计模式主要分为三类

1)创建型:主要用于类或者对象的创建

2)结构型:将类与对象组合,形成更大的结构

3)行为型:描述类与对象的交互,以及如何进行职责的分配

根据范围:
类模式 处理类和子类之间的关系 ,这些关系通过继承建立,在编译时刻就确定,属于静态
对象模式 处理对象间的关系 ,这些关系在运行时刻变化,更具 动态 性。

类模式:工厂、适配、解释器与模板

在某些综合知识的选择上注意区分

1、工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method是一个类的实例化延迟到其子类。Factory Method模式的类图如下图所示。

1.jpg

其中:

  • 类Product定义了Factory Method所创建的对象的接口。
  • 类ConcreteProduct用于实现Product接口。【Concrete:具体、确定的】
  • 类Creator声明了工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
  • 类ConcreteCreator重定义了工厂方法,以返回一个ConcreteProduct实例。

2、策略模式

一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

主要角色:

  • 环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
  • 抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
  • 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。

3、区别

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)是两种常见的设计模式,它们的主要目标是通过分离和封装变化点来提高代码的灵活性和可维护性。虽然它们都涉及到对象的创建和行为的封装,但它们在关注点和使用场景上有明显的区别。

3.1、工厂模式

1. 目的:

工厂模式的目的是封装对象的创建逻辑,通过提供一个接口或方法来创建对象,而不是直接在代码中显式使用 new 操作符。这使得代码在需要创建不同类型对象时更加灵活,便于扩展和维护。

2. 使用场景:

当你的系统需要根据条件(比如配置、参数、环境)创建不同类型的对象,并且这些对象可能在未来会有所扩展时,工厂模式是一个不错的选择。你可以通过工厂类来创建对象,而不需要在代码中显式地知道对象的具体类型。

3. 实现方式:

工厂模式可以有多种变体,包括简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。核心思想是通过工厂方法来创建对象,隐藏具体的创建逻辑。

4. 示例:
// 产品接口
interface Car {void drive();
}// 具体产品类
class Sedan implements Car {@Overridepublic void drive() {System.out.println("Driving a sedan.");}
}class SUV implements Car {@Overridepublic void drive() {System.out.println("Driving an SUV.");}
}// 工厂类
class CarFactory {public static Car createCar(String carType) {if ("sedan".equalsIgnoreCase(carType)) {return new Sedan();} else if ("suv".equalsIgnoreCase(carType)) {return new SUV();}throw new IllegalArgumentException("Unknown car type: " + carType);}
}// 测试工厂模式
public class FactoryPatternDemo {public static void main(String[] args) {Car car = CarFactory.createCar("sedan");car.drive();  // 输出: Driving a sedan.Car car2 = CarFactory.createCar("suv");car2.drive();  // 输出: Driving an SUV.}
}

3.2、策略模式

1. 目的:

策略模式的目的是封装不同的算法或行为,并让它们可以相互替换,且算法的变化不会影响使用它的客户端代码。它主要用于解决具有多个行为或算法的场景,通过策略模式将这些行为抽象为独立的策略对象,客户端可以根据需要选择不同的策略。

2. 使用场景:

当你有多种不同的算法、业务逻辑、或者行为可以应用到某个对象或场景中,并且这些行为之间是可替换的,策略模式就非常有用。它能够让客户端灵活地选择算法,而不会影响其他的代码逻辑。

3. 实现方式:

策略模式的实现通常是定义一个接口(或抽象类)表示策略,然后通过不同的策略实现类来实现不同的算法。客户端在运行时选择使用哪一个策略。

4. 示例:
// 定义策略接口
interface PaymentStrategy {void pay(int amount);
}// 具体策略类
class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paying " + amount + " using credit card.");}
}class PayPalPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paying " + amount + " using PayPal.");}
}// 上下文类
class ShoppingCart {private PaymentStrategy strategy;// 通过构造方法注入策略public ShoppingCart(PaymentStrategy strategy) {this.strategy = strategy;}public void checkout(int amount) {strategy.pay(amount);}
}// 测试策略模式
public class StrategyPatternDemo {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart(new CreditCardPayment());cart.checkout(100);  // 输出: Paying 100 using credit card.cart = new ShoppingCart(new PayPalPayment());cart.checkout(200);  // 输出: Paying 200 using PayPal.}
}

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

区别点工厂模式策略模式
核心关注点封装对象的创建逻辑封装对象的行为或算法
目的将对象的创建逻辑与使用逻辑分离,避免直接使用构造函数创建对象将不同的算法或行为封装为独立的策略,允许客户端选择不同策略
使用场景需要根据条件创建不同类型的对象时需要根据情况选择不同的算法或行为,并且这些算法可互换时
实现方式通过一个工厂类或方法创建具体对象定义策略接口,不同的策略实现具体的算法或行为
代码结构关注的是创建过程,不涉及对象的具体行为关注的是行为的多样性,通过策略对象来决定行为
代码扩展性新增对象类型时,扩展工厂方法新增算法时,只需要增加新的策略类

3.3、总结

  • 工厂模式:用于处理对象创建问题,使得创建对象的代码与使用对象的代码解耦。它关注的是“创建什么对象”。
  • 策略模式:用于处理算法或行为的变化和扩展,客户端可以在不同的算法或行为之间灵活切换。它关注的是“怎么做某件事”。

4、案例

1)某银行系统采用Factory Method方法描述其不同账户之间的关系,设计出的类图如下所示。其中与Factory Method中的“Creator”角色相对应的类是();与“Product”角色相对应的类是()。

1.jpg

“Creator”角色相对应的类是Bank;与“Product”角色相对应的类是Account。

更多的考点案例,可以使用  软考真题 APP 加以训练。

可以在“智能练题” 模块 输入 “设计模式” 自定义练题

5、23种设计模式

 带 * 的表示类,其他是对象

 

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

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

相关文章

权威解读|2024固定网国内数据传送业务办理指南

一、固定网国内数据传送业务是什么? 固定网国内数据传送业务,是指互联网数据传送业务以外的,在固定网中以有线方式提供的国内端到端数据传送业务。主要包括基于IP承载网、ATM网、X.25分组交换网、DDN网、帧中继网络的数据传送业务等。 根据…

数据库管理-第238期 23ai:全球分布式数据库-架构与组件(20240904)

数据库管理238期 2024-09-04 数据库管理-第238期 23ai:全球分布式数据库-架构与组件(20240904)1 架构图2 分片数据库与分片3 Shard Catalog4 Shard Director5 Global Service6 管理界面总结 数据库管理-第238期 23ai:全球分布式数…

地理围栏,打造智能生活新边界

随着智能手机和其他移动设备的普及,用户对基于位置获取个性化服务的需求大幅增加,例如用户进入商圈范围并停留操作一段时间后,智能触发向用户推送该商圈吃、喝、玩、乐的优惠活动消息;又如当用户到达非常驻地的机场时触发围栏&…

工业网关在汽车智能工厂中的应用-天拓四方

工业网关是工业物联网(IIoT)的关键组成部分,它充当了工业现场设备与云端或企业级系统之间的桥梁。在智能工厂中,工业网关的应用至关重要,它确保了生产线的顺畅运行,并通过数据的透明化,提升了生…

《高等代数》范德蒙德行列式的应用

说明:此文章用于本人复习巩固,如果也能帮助到大家那就更加有意义了。 注:范德蒙德行列式的简单应用及其变形。 范德蒙德行列式的计算公式: 注:(1)用大下标减去小下标。 (2&#xf…

QFile打开文件的两种方式

一、UI界面设置两个按键&#xff0c;并直接转到槽函数 二、两种代码展示 #include <QFile> #include <QDebug>//此两种方式中调用函数&#xff0c;应包含的头文件void Widget::on_btnReadFile01_clicked()//第一种打开方式 {//1. 打开文件QFile file;file.setFile…

密钥加密机的定义与功能

密钥加密机是信息安全领域中的核心设备&#xff0c;通过密码学原理&#xff0c;利用加密算法和密钥管理技术&#xff0c;对通信内容进行加密保护&#xff0c;确保数据在传输过程中的机密性、完整性和真实性。以下是对密钥加密机的详细阐述&#xff1a; 一、定义与功能 定义&…

集成电路学习:什么是OLED有机发光二极管

一、OLED&#xff1a;有机发光二极管 OLED&#xff0c;全称有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;是一种电流型的有机发光器件。以下是关于OLED的详细介绍&#xff1a; 二、OLED的定义与原理 OLED是基于有机半导体材料和发光材料在…

【游戏安全】CheatEngine基础使用——如何对不同类型的数值进行搜索?如何破解数值加密找到想修改的数值?

游戏安全 不同数值类型的搜索破解简单数值加密 不同数值类型的搜索 可以在游戏中看到很精确的物品数量&#xff0c;但是在CE中却什么都扫不到。 这是因为他的数值类型可能并不是四字节的&#xff0c;在游戏中这个数值的机制是一个慢慢增长的数值&#xff0c;所以他很有可能是…

信息安全威胁

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;我国面临的信息安全威胁 从受威胁的对象来看&#xff0c;可以将我国面临的信息安全威胁分为三类&#xff1a;国家威胁、组织威胁和个人威胁。 来自国家的威胁&#xff1a; 恐怖组…

Hive服务部署及Datagrip工具使用

目录 Hive服务部署 Hiveserver2服务 1&#xff09;用户说明 2&#xff09;Hiveserver2部署 &#xff08;1&#xff09;Hadoop端配置 &#xff08;2&#xff09;Hive端配置 3&#xff09;测试 &#xff08;1&#xff09;启动Hiveserver2 &#xff08;2&#xff09;使用命…

计算机工具软件安装攻略:Visual Studio Code下载、安装和使用

Visual Studio Code下载、安装和使用 1 Visual Studio Code简介 Visual Studio Code通常简称为VS Code&#xff0c;是一款由微软开发的免费、开源的轻量级代码编辑器。它在开发者社区中非常受欢迎&#xff0c;具有强大的功能和扩展性&#xff0c;适用于多种编程语言和开发场景…

激光器原理--材料篇

半导体材参杂 https://zhuanlan.zhihu.com/p/24683205 能带跃迁&#xff0c;能量变化&#xff0c;从电变为光。 Si半导体是间隙带隙&#xff0c; 三五族是直接带隙。直接带隙方便跃迁&#xff0c;容易出光

Verilog基础,原码,反码与补码的概念

Verilog模块初认识 1、Verilog模块(Module) Verilog中的module可以看成一个具有输入输出端口的黑盒子&#xff0c;该黑盒子有输入和输出接口(信号)&#xff0c;通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数) 图1 模块示意图 1.1 模块描述 图1 所示的…

el-table利用折叠面板 type=“expand“ 嵌套el-table,并实现 明细数据多选,选中明细数据后返回原数据得嵌套格式

效果图: 废话不多说直接上代码&#xff0c;完整代码展示&#xff1a; <template><el-tableborderref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"><el-table-columnwidth"50"la…

简单的Linux Ftp服务搭建

简单的Linux FTP服务搭建 1.需求 公司有一个esb文件传输代理&#xff0c;其中我们程序有文件传输功能&#xff0c;需要将本地文件传输到esb文件代理服务器上&#xff0c;传输成功之后发送http请求&#xff0c;告知esb将固定文件进行传输到对应外围其他服务的文件目录中&#…

[环境配置]Pycharm手动安装汉化插件

在Pycharm-file-setting-Plugins中&#xff0c;搜索chinese&#xff0c;就会出现汉化包 点击install后&#xff0c;在安装时出现这种报错&#xff1a;Plugin "Chinese (Simplified) Language Pack / 中文语言包" was not installed: Invalid filename returned by a …

Microk8s ingress启动失败, 10254端口被占用问题定位

问题描述 RHEL9 VM里安装了Microk8s&#xff0c;且使用了Nginx ingress Controller插件&#xff0c;443端口正常。 VM重启一次后&#xff0c;发现443端口没有LISTEN&#xff0c;不能对外提供服务。 定位过程 查看ingress pod状态&#xff0c;为CrashLoopBackOff # kubectl …

函数式接口实现策略模式

函数式接口实现策略模式 1.案例背景 我们在日常开发中&#xff0c;大多会写if、else if、else 这样的代码&#xff0c;但条件太多时&#xff0c;往往嵌套无数层if else,阅读性很差&#xff0c;比如如下案例&#xff0c;统计学生的数学课程的成绩&#xff1a; 90-100分&#…

yaml文件查看模型的架构

最近在看hrnet模型代码&#xff0c;想查看hrnet的模型架构&#xff0c;输出一下&#xff0c;但是模型参数需要cfg&#xff0c;我就想着怎么把yaml文件导进来然后打印模型呢&#xff0c;直接chat就可以了&#xff0c;下面解释一下每一部分&#xff0c;非常的好理解 yaml文件格式…