【C++ 设计模式】策略模式与简单工厂模式的结合

文章目录

  • 前言
  • 一、为什么需要策略模式+简单工厂模式
  • 二、策略模式+简单工厂模式实现原理
  • 三、UML图
  • 四、示例代码
  • 总结


前言

在软件设计中,常常会遇到需要根据不同情况选择不同算法或行为的情况。策略模式和简单工厂模式是两种常见的设计模式,它们分别解决了对象行为的抽象和对象创建的抽象问题。在某些情况下,将这两种模式结合起来可以更好地满足实际需求,提高代码的灵活性和可维护性。

策略模式与简单工厂模式的结合:

策略模式用于定义一系列算法,将每个算法封装到独立的类中,并使它们可以相互替换,从而使得算法可以独立于客户端而变化。简单工厂模式用于封装对象的创建过程,将对象的创建与客户端解耦。

将策略模式与简单工厂模式结合起来,可以使得在创建具体策略对象时更加灵活,同时保持了策略对象的封装性。通过简单工厂模式,我们可以根据客户端的需求动态创建不同的具体策略对象,而策略模式则确保了这些对象可以被客户端无缝地使用。


一、为什么需要策略模式+简单工厂模式

当我们面对需要根据不同情况选择不同算法或行为的情况时,策略模式是一个很好的选择。它允许我们将不同的算法封装成独立的类,并且可以在运行时灵活地切换这些算法,而不影响客户端代码。然而,单独使用策略模式时,我们需要在客户端代码中显式地创建具体策略对象,这可能导致代码变得复杂,尤其当需要根据不同条件选择不同的策略时。

这时候,简单工厂模式可以派上用场。简单工厂模式提供了一个统一的接口来创建对象,客户端只需提供简单的参数,而不必了解具体对象的创建过程。将策略模式与简单工厂模式结合起来,可以在需要时动态地创建不同的具体策略对象,同时保持代码的简洁和可维护性。简单工厂模式负责对象的创建,而策略模式确保了这些对象可以被灵活地使用,让我们的软件更加智能和适应变化。这种结合使用的设计模式能够提高代码的灵活性、可扩展性和可维护性,使得软件系统更加健壮和易于理解。

二、策略模式+简单工厂模式实现原理

  • 策略模式:

首先定义一个策略接口(或抽象类),其中包含定义了一系列算法的方法。
创建具体的策略类,分别实现策略接口中的方法,每个具体策略类代表一个具体的算法。
在客户端中,持有一个策略接口的指针(或引用),可以动态切换不同的具体策略对象。
当客户端需要使用某个具体的算法时,调用策略接口中定义的方法即可。

  • 简单工厂模式:

创建一个工厂类,负责根据传入的参数来创建具体的对象。
工厂类中包含一个方法,根据不同的参数返回不同的具体对象实例。

  • 结合实现原理:

在策略模式中,客户端通常需要显式地创建具体策略对象,这可能会导致代码的复杂性。
为了解决这个问题,可以将具体策略对象的创建委托给简单工厂,通过简单工厂模式动态地创建具体的策略对象。
这样,客户端只需要和简单工厂打交道,向工厂传递参数即可获取所需的具体策略对象,而无需直接创建对象。
当需要在运行时根据不同条件选择不同的策略时,可以通过简单工厂来创建不同的策略对象,然后使用策略模式来执行具体的算法。

三、UML图

在这里插入图片描述
通过UML图可以发现简单工厂模式和策略模式+简单工厂模式非常的像啊!其主要差别就是工厂生成的类有一个统一执行的函数execute函数用来变成策略模式,进而就有了策略模式的特征了

四、示例代码

#include <iostream>
#include <memory>// 抽象策略类
class Strategy {
public:virtual void execute() const = 0;virtual ~Strategy() {}
};// 具体策略类 A
class ConcreteStrategyA : public Strategy {
public:void execute() const override {std::cout << "Executing strategy A\n";}
};// 具体策略类 B
class ConcreteStrategyB : public Strategy {
public:void execute() const override {std::cout << "Executing strategy B\n";}
};// 工厂类,用于创建具体策略对象
class StrategyFactory {
public:static Strategy* createStrategy(char type) {switch (type) {case 'A':return new ConcreteStrategyA;case 'B':return new ConcreteStrategyB;default:throw std::invalid_argument("Invalid strategy type");}}
};int main() {// 使用工厂类创建具体策略对象auto strategyA = StrategyFactory::createStrategy('A');auto strategyB = StrategyFactory::createStrategy('B');// 执行策略strategyA->execute();strategyB->execute();return 0;
}

在这里插入图片描述
抽象策略类(Strategy):定义了执行策略的接口 execute(),所有具体策略类都要实现这个接口。

具体策略类(ConcreteStrategyA 和 ConcreteStrategyB):实现了具体的策略,分别是策略 A 和策略 B。它们提供了不同的行为实现方式。

工厂类(StrategyFactory):用于创建具体策略对象。createStrategy 方法根据传入的参数类型决定创建哪种具体策略对象。

主函数(main):在 main 函数中,通过工厂类创建了具体的策略对象 strategyA 和 strategyB,分别对应策略 A 和策略 B。然后调用这些策略对象的 execute() 方法执行相应的策略。

实现决策的原理在于通过工厂类的 createStrategy 方法根据输入的参数类型来动态创建具体的策略对象。这种方式使得客户端代码与具体策略对象的创建过程解耦,同时利用了策略模式的灵活性,能够在运行时动态地切换不同的策略。


总结

策略模式与简单工厂模式的结合,能够很好地将对象的行为和对象的创建分离,使得系统更具灵活性和可扩展性。通过将具体策略对象的创建委托给简单工厂,我们可以在不改变客户端代码的情况下动态地切换不同的策略,从而更好地满足不同的业务需求。这种结合使用的设计模式在实际项目中具有广泛的应用价值,可以帮助我们更好地组织和管理代码结构,提高代码的可维护性和可扩展性。

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

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

相关文章

机器学习-04-分类算法-02贝叶斯算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法与贝叶斯算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

如何使用Python进行数据可视化:Matplotlib和Seaborn指南【第123篇—Matplotlib和Seaborn指南】

如何使用Python进行数据可视化&#xff1a;Matplotlib和Seaborn指南 数据可视化是数据科学和分析中不可或缺的一部分&#xff0c;而Python中的Matplotlib和Seaborn库为用户提供了强大的工具来创建各种可视化图表。本文将介绍如何使用这两个库进行数据可视化&#xff0c;并提供…

数据结构与算法第八套试卷

1.建立一个长度为n的有序单链表的时间复杂度 0(n^2) 2.哈希算法 key%p&#xff1a;p最好为质数 如果两个关键字的值不等但哈希函数值相等&#xff0c;则称这两个关键字为同义词&#xff08;正确&#xff09;&#xff1b; 3.二分查找 注意&#xff1a; 二分查找是向下查询…

pytest生成allure的报告

首先要下载安装配置allure allure serve ./outputs/allure_report 可以生成html的文件自动在默认浏览器中打开

栈的应用——括号匹配

用栈实现 1、初始化一个栈&#xff0c;用来存左括号 2、遍历扫描括号字符串 如果遇到左括号&#xff0c;无脑入栈如果遇到右括号&#xff0c;此时栈空返回false&#xff0c;不空的话进行括号匹配。匹配不成功返回false&#xff0c;匹配成功将栈顶的那个左括号出栈。 遍历完之后…

Android Kotlin知识汇总(三)Kotlin 协程

Kotlin的重要优势及特点之——结构化并发 Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理&#xff0c;例如网络调用、本地数据访问等任务的管理。本主题介绍如何使用 Kotlin 协程解决以下问题&#xff0c;从而让您能够编写出更清晰、更简洁的应用代…

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器&#xff08;3&#xff09;Bug问题记录1&#xff…

52 硬中断的实现

前言 呵呵 中断机制 也是内核中很常见的机制了 中断机制是现代计算机系统中的基本机制之一&#xff0c;它在系统中起着通信网络的作用&#xff0c;以协调系统对各种外部事件的响应和处理&#xff0c;中断是实现多道程序设计的必要条件&#xff0c;中断是CPU 对系统发生的某个…

几何造型库 - osgModeling

基于osg的几何造型库(osgModeling-0.1.1)的编译成果和示例&#xff1a; basic: boolean: bsp-tree:

Educational Codeforces Round 163 (Rated for Div. 2)

Educational Codeforces Round 163 (Rated for Div. 2) Educational Codeforces Round 163 (Rated for Div. 2) A. Special Characters 题意&#xff1a; 给出特殊字符的定义&#xff0c;在一组字符串中当前字符的相邻字符有且仅有一个与自身相同的字符&#xff0c;找出具有…

webshell隐藏哥斯拉流量修改sqlmap改ua

webshell隐藏 windows 1.隐藏shell attrib "文件名" s h attrib "文件名" -s -h 2.利用系统代号隐藏shell 创建文件夹名为Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}&#xff0c;此时文件夹将变成我的电脑&#xff0c;无法看到里面的东西&…

Window部署AgileConfig

AgileConfig&#xff1a;分布式配置中心 github&#xff1a;GitHub - dotnetcore/AgileConfig: 基于.NET Core开发的轻量级分布式配置中心 / .NET Core lightweight configuration server 下载部署包&#xff1a;Releases dotnetcore/AgileConfig GitHub 版本&#xff1a;…