策略模式+简单工厂

🍇工厂模式
🍈工厂模式向策略模式过度——工厂加一个保安
🍏策略模式
🍐策略模式+简单工厂

声明本文需要理解多态的基础上才能来学习
欢迎前来学习——继承和多态
学习记录

工厂模式

在这里插入图片描述
需要什么就生成什么

// 工厂模式
class Factory
{
	// 这个是工厂
public:
	Factory()
	{
		puts("Factory");
	}
	//virtual void func() = 0;// 不能使用纯虚函数,使用纯虚函数就不能在工厂中创建对象
	// virtual void func();// 也不能只声明不定义
	virtual void func()
	{}
};
class FactoryA :public Factory
{
public:
	FactoryA()
	{
		puts("FactoryaA");
	}
	void func()
	{
		puts("funcA");
	}
};
class FactoryB :public Factory
{
public:
	FactoryB()
	{
		puts("FactoryB");
	}
	void func()
	{
		puts("funcB");
	}
};

int main()
{
	FactoryA a;
	a.func();
	FactoryB b;
	b.func();

	return 0;
}

: 看了代码上面的内容之后,我就想问,都要写3个类了,为什么不直接实现成3个毫无关系的类呢,为什么要实现成多态的形式,多麻烦呀

: 话是这么说没错,但是,让他们没有联系,如果有100个类,他们需要进行改动,需要添加一个函数,那么就需要改动100次;而如果使用继承,就可以大大减少工作量

工厂模式向策略模式过度——工厂加一个保安

在这里插入图片描述

class Factory
{
	// 这个是工厂
public:
	Factory()
	{
		puts("Factory");
	}
	//virtual void func() = 0;// 不能使用纯虚函数,使用纯虚函数就不能在工厂中创建对象
	// virtual void func();// 也不能只声明不定义
	virtual void func()
	{}
};
class FactoryA :public Factory
{
public:
	FactoryA()
	{
		puts("FactoryaA");
	}
	void func()
	{
		puts("funcA");
	}
};
class FactoryB :public Factory
{
public:
	FactoryB()
	{
		puts("FactoryB");
	}
	void func()
	{
		puts("funcB");
	}
};
class Context
{
	// 这个是将产品给他管理
public:
	Context()
	{
		puts("Context");
	}
	// 这里需要实现多态,不同的产品有不同的行为
	Context(Factory* tem)
	{
		s = tem;
		puts("Context");
	}
	void Interface()
	{
		s->func();
	}
	Factory* s;
};

好处就在于使用者就可以忽略多态这个特性直接向平常的函数一样使用就可以了

策略模式

策略模式:在用户使用的时候手动进行判断,判断需要使用哪个产品进行生产
在这里插入图片描述

策略模式+简单工厂

策略模式+工厂模式就是为了解决需要手动判断的问题——降低使用难度,简化使用步骤

具体实现就是将判断的逻辑放到Context内部
在这里插入图片描述

#include<iostream>
using namespace std;

// 策略模式+工厂模式
class Strategy
{
	// 这个是工厂
public:
	Strategy()
	{
		puts("Strategy");
	}
	//virtual void func() = 0;// 不能使用纯虚函数,使用纯虚函数就不能在工厂中创建对象
	// virtual void func();// 也不能只声明不定义
	virtual void func()
	{}
};
class StrategyA :public Strategy
{
public:
	StrategyA()
	{
		puts("StrategyA");
	}
	void func()
	{
		puts("funcA");
	}
};
class StrategyB :public Strategy
{
public:
	StrategyB()
	{
		puts("StrategyB");
	}
	void func()
	{
		puts("funcB");
	}
};
class Context
{
	// 这个是将产品给他管理
public:
	Context()
	{
		puts("Context");
	}
	// 这里需要实现多态,不同的产品有不同的行为
	//Context(Strategy* tem)
	//{
	//	s = tem;
	//	puts("Context");
	//}
	Context(int t)
	{
		switch (t)
		{
		case 0:
			s = new StrategyA;
			break;
		case 1:
			s = new StrategyB;
			break;
		}
	}
	void Interface()
	{
		s->func();
	}
	Strategy* s;
};

int main()
{
	Context con(1);
	con.Interface();

	return 0;
}

这种方式能让代码更美观

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2. 数据的表示和运算

2.数据的表示和运算 文章目录 2.数据的表示和运算2.1.1进位计数制r进制计数法任意进制->二进制二进制<->八进制、十六进制二进制->八进制二进制->十六进制八进制->二进制十六进制->二进制 各种进制的常见书写方式十进制->任意进制整数部分小数部分 真值…

哈默纳科Harmonic谐波减速机应用领域有哪些

在制造设备中&#xff0c;精确控制速度与位置的需求日益凸显&#xff0c;这为谐波减速机的广泛应用提供了广阔的舞台。哈默纳科Harmonic谐波减速机以结构紧凑、高精度、高刚度、高可靠性、便于安装维护等优势&#xff0c;在工业机器人和自动化系统中发挥着举足轻重的作用。 一、…

C语言—内存函数

1. memcpy 使用和模拟实现 void* memcpy&#xff08;void* destination&#xff0c;const void* source&#xff0c;size_t num&#xff09;&#xff1b; 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 ‘\0’ 的时候并不…

使用 Scapy 库编写 ICMP 洪水攻击脚本

一、介绍 ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制消息协议&#xff09;洪水攻击&#xff08;ICMP Flood Attack&#xff09;是一种常见的网络攻击类型&#xff0c;旨在消耗目标系统的网络资源和带宽。这种攻击通过发送大量的ICMP消息给目标…

JAVA开发的一套(智造制造领航者云MES系统成品源码)saas云MES制造执行系统源码,全套源码,支持二次开发

JAVA开发的一套&#xff08;智造制造领航者云MES系统成品源码&#xff09;saas云MES制造执行系统源码&#xff0c;全套源码&#xff0c;支持二次开发 1990年11月&#xff0c;美国先进制造研究中心AMR&#xff08;Advanced Manufacturing Research&#xff09;就提出了MES&#…

定时器的使用和实现

目录 一.定时器Timer类的主要方法 二.定时器Timer类的使用 三.定时器的模拟实现 一.定时器Timer类的主要方法 定时器Timer类在java.util包中。 使用前先进行实例化&#xff0c;然后使用实例的schedule(TimerTask task, long delay)方法&#xff0c;设定指定的任务task在指…

跟着小白学linux的基础命令

小白学习记录&#xff1a; 前情提要&#xff1a;Linux命令基础格式!查看 lsLinux 的7种文件类型及各颜色代表含义 进入指定目录 cd查看当前工作目录 pwd创建一个新的目录(文件夹&#xff09; mkdir创建文件 touch查看文件内容 cat、more操作文件、文件夹- 复制 cp- 移动 mv- 删…

从混乱到有序:PDM系统如何优化物料编码

在现代制造业中&#xff0c;物料管理是企业运营的核心。物料编码作为物料管理的基础&#xff0c;对于确保物料的准确性、唯一性和高效性至关重要。随着产品种类的不断增加和产品变型的多样化&#xff0c;传统的物料编码管理方式已经不能满足企业的需求。本文将探讨产品数据管理…

SOLIDWORKS参数化设计插件 慧德敏学

SOLIDWORKS软件是法国达索公司的产品&#xff0c;最初是满足欧美一些工程师产品设计需要而开发的&#xff0c;并没有考虑中国的企业实际情况。我们为满足国内客户的需要&#xff0c;对SOLIDWORKS进行了二次开发&#xff0c;借助SolidKits.AutoWorks参数化工具&#xff0c;通过一…

计算机网络-OSI七层参考模型与数据封装

目录 一、网络 1、网络的定义 2、网络的分类 3、网络的作用 4、网络的数据传输方式 5、网络的数据通讯方式 二、OSI七层参考模型 1、网络参考模型定义 2、分层的意义 3、分层与功能 4、TCP\IP五层模型 三、参考模型的协议 1、物理层 2、数据链路层 3、网络层 4…

SQL面试问题集

目录 Q.左连接和右连接的区别 Q.union 和 union all的区别 1、取结果的交集 2、获取结果后的操作 Q.熟悉开窗函数吗&#xff1f;讲一下row_number和dense_rank的区别。 Q.hive行转列怎么操作的 Q.要求手写的题主要考了聚合函数和窗口函数&#xff0c;row_number()&#…

SSM旅游论坛(前后分离源码+论文)

该旅游论坛是基于Spring、SpringMVC、Mybatis框架开发出来的 用户信息管理 此页面提供给管理员的功能有&#xff1a;用户信息的查询管理&#xff0c;可以删除用户信息、修改用户信息、新增用户信息&#xff0c; 还进行了对用户名称的模糊查询的条件 景点信息管理 论坛类型管理…

走进 Apache 世界的另一扇大门

引言 作为热爱技术的你&#xff0c;是否也羡慕 Apache PMC 或者 Committer&#xff0c;此篇文章渣渣皮带你迈出如何成为技术大牛的第一步。 当然我现在还是一枚小小的 code contributor&#xff0c;在成为 committer 的路上还在奋力打码中&#xff0c;写这篇文章也是为大家有…

C# Interlocked 原子操作

目录 注解 方法 适用于 案例 1&#xff1a;Add 对两个整数进行求和并用和替换第一个整数&#xff0c;上述操作作为一个原子操作完成 2&#xff1a;Exchange Exchange(UInt32, UInt32) 以原子操作的形式&#xff0c;将 32 位无符号整数设置为指定的值并返回原始值。 参考…

存储设备有哪些?属于私有云平台吗?怎么理解?

数字化的今天&#xff0c;数据已经成为了企业最重要最宝贵的资产了。为了保障数据的安全、可靠和高效利用&#xff0c;存储设备和云计算技术应运而生。今天我们大家就来聊聊存储设备有哪些&#xff1f;属于私有云平台吗&#xff1f;怎么理解&#xff1f; 存储设备有哪些&…

thinkadmin发邮件功能如何设置?怎么使用?

thinkadmin发邮件有哪些注意事项&#xff1f;支持哪些邮件服务&#xff1f; 在使用thinkadmin框架进行开发时&#xff0c;发邮件功能的设置是一个常见的需求。通过合理配置和简单的编程&#xff0c;我们可以轻松地在thinkadmin中集成邮件发送功能。AokSend将详细介绍如何设置t…

动态规划9:LCR 099. 最小路径和

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;LCR …

在VS Code中操作MySQL数据库

创建MySQL连接 操作前需要先启动MySQL数据库&#xff0c;个别情况下需要以管理员身份打开cmd&#xff0c;在cmd中输入&#xff1a; net start mysql 我的MySQL数据库服务名为mysql84&#xff0c;需要填写自己的mysql服务名称。 随后在VS Code中下载插件 Prettier SQL VSCode …

新手必看!场外期权交易的六大注意事项

场外期权交易的六大注意事项 对于初涉金融市场的投资者来说&#xff0c;场外期权交易无疑是一个既具吸引力又充满挑战的领域。为确保您在交易中能够稳健获利&#xff0c;以下六大注意事项值得每位新手仔细研读。 文章来源/&#xff1a;财智财经 一、深入理解期权基本概念 场…

海思SS928(SD3403)部署YOLOv5-YOLOv7步骤详解

1. YOLO模型资料 本文档内容以yolov5-7.0工程、yolov5s模型为例。 a. 模型结构 详细的模型结构可以利用netron工具打开.pt或.onnx模型查看。 b. 模型参数即验证结果 其中,YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x为五种类型的预训练模型,其包含的检测类别相…