策略模式+简单工厂

news2024/11/26 21:30:49

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

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

工厂模式

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

// 工厂模式
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;
}

这种方式能让代码更美观

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

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

相关文章

DP读书:如何使用badge?(开源项目下的标咋用)

最近在冲论坛&#xff0c;很少更一些内容了。但遇到了一个真的有趣的&#xff1a; 开源项目下&#xff0c;蓝蓝绿绿的标是怎么用的呢&#xff1f; 这是我的主页Readme&#xff0c;在看一些NXP的主仓时&#xff0c;突然发现没有这个玩&#xff0c;就自己整了个 再比如我的CSDN专…

php高级之框架源码、宏扩展原理与开发

在使用框架的时候我们经常会看到如下代码 类的方法不会显示地声明在代码里面&#xff0c;而是通过扩展的形式后续加进去&#xff0c;这么做的好处是可以降低代码的耦合度、保证源码的完整性。我自己看着框架源码实现了这个功能。 以下是结果: base代码 index.php <?php…

WPS表格插件方方格子【凑数】功能:选出和等于固定数字的数

文章目录 后来发现可以下载方方格子插件&#xff0c;使用【凑数】功能https://ffcell.lanzouj.com/iwhfc1kjhayh【凑数】快速【凑数】 导师让沾发票&#xff0c;需要选出若干个数额的发票&#xff0c;使它们的和等于一个指定数。不知道怎么办了&#xff0c;查了一下&#xff0c…

【MySQL】数据库入门基础

文章目录 一、数据库的概念1. 什么是数据库2. 主流数据库3. mysql和mysqld的区别 二、MySQL基本使用1. 安装MySQL服务器在 CentOS 上安装 MySQL 服务器在 Ubuntu 上安装 MySQL 服务器验证安装 2. 服务器管理启动服务器查看服务器连接服务器停止服务器重启服务器 3. 服务器&…

三十九、openlayers官网示例Extent Interaction解析——在地图上绘制范围并获取数据

官网demo 地址&#xff1a; Extent Interaction 在openlayers中可以使用ExtentInteraction添加交互事件&#xff0c;配合shiftKeyOnly实现按住shift键绘制边界区域。 const map new Map({layers: [new TileLayer({source: new OSM(),}),],target: "map",view: new …

【贡献度分析(帕累托图)】

文章目录 前言一、贡献度分析是什么&#xff1f;二、使用步骤1. 准备数据2. 排序数据3. 绘制帕累托图4. 分析结果5. 实际应用 三、示例代码 前言 贡献度分析也称为帕累托分析。它可以帮助我们理解数据集中各个因素对整体影响的程度&#xff0c;从而优先处理最重要的因素&#…

oracle数据库通过impdp导入数据时提示,ORA-31684:对象类型用户xxx已存在,和ORA-39151:表xxx存在的解决办法

前提条件&#xff1a;首先备份原数据库中此用户对应的schemas 比如名为cams_wf的schemas 以便出了问题后还可以恢复原数据。 解决办法一、 通过命令或者数据库管理工具删除掉此schemas下的所有表&#xff0c;然后在impdp中加入ignorey 来忽略ORA-31684&#xff1a;对象类型用…

分享一个 .Net core Console 项目使用 SqlSugar 的详细例子

前言 SqlSugar 是一款老牌的 .NET 开源 ORM 框架&#xff0c;性能高&#xff0c;功能全面&#xff0c;使用简单&#xff0c;支持 .NET FrameWork、.NET Core3.1、.NET5、.NET6、.NET7、.NET8、.NET9 等版本&#xff0c;线上论坛非常活跃&#xff0c;今天给大伙分享一个 .Net c…

SCARA机器人中旋转花键的维护和保养方法!

作为精密传动元件的一种&#xff0c;旋转花键在工作过程中承受了较大的负荷。在自动化设备上运用广泛&#xff0c;如&#xff1a;水平多关节机械手臂&#xff08;SCARA&#xff09;、产业用机器人、自动装载机、雷射加工机、搬运装置、机械加工中心的ATC装置等&#xff0c;最适…

services层和controller层

services层 我的理解&#xff0c;services层是编写逻辑代码语句最多的一个层&#xff0c;非常重要&#xff0c;在实际的项目中&#xff0c;负责调用Dao层中的mybatis&#xff0c;在我的项目中它调用的是这两个文件 举例代码如下 package com.example.sfdeliverysystem.servic…

K8s资源管理Dashboard的搭建

一、准备 接上篇k8s集群搭建&#xff1a; https://blog.csdn.net/FORLOVEHUAN/article/details/139493668?spm1001.2014.3001.5501 Dashboard是官方提供的一个UI&#xff0c;可用于基本管理K8s资源。 与k8s版本对应关系&#xff1a; https://github.com/kubernetes/dashboard…

LLama2源码分析——Rotary Position Embedding分析

参考&#xff1a;一文看懂 LLaMA 中的旋转式位置编码&#xff08;Rotary Position Embedding&#xff09; 原理推导参考自上文&#xff0c;以下结合huggingface代码分析公式计算过程 1 旋转角度计算 计算公式如下&#xff0c;其中d为词嵌入维度&#xff0c;这部分和论文原文…

Vue——监听器简单使用与注意事项

文章目录 前言编写简单demo注意事项 前言 监听器&#xff0c;在官网中称为侦听器&#xff0c;个人还是喜欢称之为监听器。官方文档如下&#xff1a; vue 官网 侦听器 编写简单demo 侦听器在项目中通常用于监听某个属性变量值的变化&#xff0c;并根据该变化做出一些处理操作。…

冯喜运:6.7今日黄金原油行情分析及独家操作策略

【黄金消息面分析】&#xff1a;周三&#xff08;6月5日&#xff09;&#xff0c;金价回升逾1.2%&#xff0c;收盘报每盎司2,355.49美元&#xff0c;全面收复前一交易日的跌幅。周三当天前公布的美国民间就业数据弱于预期&#xff0c;增强了美联储将在今年晚些时候降息的预期&a…

AI大数据处理与分析实战--体育问卷分析

AI大数据处理与分析实战–体育问卷分析 前言&#xff1a;前一段时间接了一个需求&#xff0c;使用AI进行数据分析与处理&#xff0c;遂整理了一下大致过程和大致简要结果&#xff08;更详细就不方便放了&#xff09;。 文章目录 AI大数据处理与分析实战--体育问卷分析一、数据…

[Python]用Qt6和Pillow实现截图小工具

本文章主要讲述的内容是&#xff0c;使用python语言借助PyQt6和Pillow库进行简单截图工具的开发&#xff0c;含义一个简单的范围裁剪和软件界面。 主要解决的问题是&#xff0c;在高DPI显示屏下&#xff0c;坐标点的偏差导致QWidget显示图片不全、剪裁范围偏差问题。 适合有一点…

Spark MLlib 机器学习详解

目录 &#x1f349;引言 &#x1f349;Spark MLlib 简介 &#x1f348; 主要特点 &#x1f348;常见应用场景 &#x1f349;安装与配置 &#x1f349;数据处理与准备 &#x1f348;加载数据 &#x1f348;数据预处理 &#x1f349;分类模型 &#x1f348;逻辑回归 &a…

【Linux网络】传输层协议 - UDP

文章目录 一、传输层&#xff08;运输层&#xff09;运输层的特点复用和分用再谈端口号端口号范围划分认识知名端口号&#xff08;Well-Know Port Number&#xff09;两个问题① 一个进程是否可以绑定多个端口号&#xff1f;② 一个端口号是否可以被多个进程绑定&#xff1f; n…

Java Web学习笔记15——DOM对象

DOM&#xff1a; 概念&#xff1a;Document Object Model&#xff1a; 文档对象模型 将标记语言的各个组成部分封装为对应的对象&#xff1a; Document: 整个文档对象 Element&#xff1a;元素对象 Attribute&#xff1a; 属性对象 Text&#xff1a;文本对象 Comment&a…

logback删除日志文件和文件夹

​​​​​一&#xff0c;事由和源码 logback版本1.2.11 网上找了很多都是无法删除文件夹的&#xff0c;原先使用的TimeBasedRollingPolicy无法删除日志的文件夹&#xff0c;有很多空的日期文件夹&#xff0c;于是查看TimeBasedRollingPolicy源码发现有校验不删除文件夹&#x…