当前位置: 首页 > news >正文

C++简单工厂模式

什么是简单工厂模式?

  1. 简单工厂模式属于创造型模式,而工厂就是负责生产和创造的,顾名思义。
  2. 建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

简单工厂模式解决了什么问题?

  1. 客户不用关心工厂内部的构造手段,减小了客户使用代码的出错率。这里的客户表示的是使用你代码的人,当然你自己就是使用别人代码的人。
  2. 代码赋予结构性,减小了后期开发和维护难度。

简单工厂模式应用场景举例

  1. 一个软件系统提供了多个外观不同的按钮,它们都继承于按钮类,客户希望在使用这些按钮的时候,希望使用以下三个步骤来得到:
  • 调用工厂给出的创建方法;
  • 传入目标按钮对应的参数;
  • 返回目标按钮对象。

上述流程使客户使用该接口时非常方便。

分析如何构造简单工厂模式?

  1. 有一个可以统一对外输出产品的工厂类(Factory),并且该类提供了一个所有产品的统一构造方法,该方法要求传入目标产品对应的参数,返回的是目标产品对象;
  2. 一个抽象的产品类(Product);
  3. 多个具体的产品类(ProductA,ProductB…),继承于抽象的产品类。

简单工厂模式的类图

在这里插入图片描述

简单工厂模式的代码示例

#include<iostream>
#include<memory>//工厂创造具体产品时输入的参数
typedef enum   
{A,B
}ProductType;//抽象产品类
class Product
{public:Product(){std::cout<<"Product constructor"<<std::endl;};~Product(){std::cout<<"Product destructor"<<std::endl;};virtual void produce()const{};};//具体产品A
class ProductA:public Product
{public:ProductA(){std::cout<<"ProductA constructor"<<std::endl;};~ProductA(){std::cout<<"ProductA destructor"<<std::endl;};void produce()const {std::cout<<"我是产品 A"<<std::endl;}
};//具体产品B
class ProductB:public Product
{public:ProductB(){std::cout<<"ProductB constructor"<<std::endl;};~ProductB(){std::cout<<"ProductB destructor"<<std::endl;};void produce()const {std::cout<<"我是产品 B"<<std::endl;}
};//工厂类
class Factory
{public:Factory(){std::cout<<"Factory constructor"<<std::endl;};~Factory(){std::cout<<"Factory destructor"<<std::endl;};std::shared_ptr<Product> CreateProduct(ProductType type)//面向客户的方法,生产对应的产品只需要输入对应的产品类型即可返回(生成)对应的产品{switch (type){case A:return std::make_shared<ProductA>();break;case B:return std::make_shared<ProductB>();break;default:return nullptr;break;}}};

简单工厂模式的使用步骤和示例

  1. 构建工厂
  2. 构建抽象产品
  3. 了解具体产品
  4. 生产具体产品
  5. 投入使用
  • 示例
//
ProductType WeNeedProtductA(){return ProductType::A;};
ProductType WeNeedProtductB(){return ProductType::B;};int main(int argc, char const *argv[])
{//使用步骤1:构建工厂Factory factory;//使用步骤2:构建抽象产品(客户具体需要什么产品还不知道)std::shared_ptr<Product>product;//使用步骤3:客户打电话询问得知需要A类产品ProductType product_type = WeNeedProtductA();//使用步骤4:已经确定需要的具体产品,开始生产product = factory.CreateProduct(static_cast<ProductType>(product_type));//使用步骤5:客户已经得到想要的产品,开始投入使用product->produce();return 0;
}

简单工厂模式的使用示例输出

Factory constructor
Product constructor
ProductA constructor
我是产品 A
ProductA destructor
Product destructor
Factory destructor

附录

示例代码仓库

相关文章:

C++简单工厂模式

什么是简单工厂模式&#xff1f; 简单工厂模式属于创造型模式&#xff0c;而工厂就是负责生产和创造的&#xff0c;顾名思义。建立对象的类就如一个工厂&#xff0c;而需要被建立的对象就是一个个产品&#xff1b;在工厂中加工产品&#xff0c;使用产品的人&#xff0c;不用在…...

讲讲 kafka 维护消费状态跟踪的方法?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲 kafka 维护消费状态跟踪的方法&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲讲 kafka 维护消费状态跟踪的方法&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#x…...

MySQL 和 PostgreSQL 的对比概述

MySQL 和 PostgreSQL 是两种广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们各自有其特点和优缺点。以下将从多个方面对它们进行详细比较。 1. 介绍 MySQL&#xff1a; MySQL 由瑞典公司 MySQL AB 开发&#xff0c;2008 年被 Sun Microsyst…...

【Python单元测试】pytest框架单元测试 配置 命令行操作 测试报告 覆盖率

单元测试&#xff08;unit test&#xff09;&#xff0c;简称UT。本文将介绍在Python项目中&#xff0c;pytest测试框架的安装&#xff0c;配置&#xff0c;执行&#xff0c;测试报告与覆盖率 pytest简介 pytest是一款流行的&#xff0c;简单易上手的单元测试框架&#xff0c;…...

【牛客刷题记录】【JAVA】栈

(1) 用两个栈实现队列 链接 很简单&#xff0c;如果有元素进入队列&#xff0c;则将其进入stack1。如果要出队列&#xff0c;那么就需要判断stack2的情况。人与法国stack2为空&#xff0c;则直接把stack1的元素全放进stack2&#xff08;相当于顺序反过来&#xff09;&#xff…...

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班&#xff0c;没有时间整理照片&#xff0c;偶尔导一次&#xff0c;几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接&#xff0c;速度更快、更稳定&#xff0c;不会出现数据线连接时碰碰就断网的问题 1、先打开电…...

62-Java-面试专题(1)__基础

62-Java-面试专题(1)__基础-- 笔记 笔记内容来源与黑马程序员教学视频 文章目录 62-Java-面试专题(1)__基础-- 笔记Java-面试专题(1)笔记中涉及资源&#xff1a; 一、二分查找①&#xff1a;代码实现1. 流程2. 代码实现3. 测试 ②&#xff1a;解决整数溢出&#xff08;方法一&…...

快速构建数据产品原型 —— 我用 VChart Figma 插件

快速构建数据产品原型 —— 我用 VChart Figma 插件 10 种图表类型、24 种内置模板类型、丰富的图表样式配置、自动生成图表实现代码。VChart Figma 插件的目标是提供 便捷好用 & 功能丰富 & 开发友好 的 figma 图表创建能力。目前 VChart 插件功能仍在持续更新中&…...

登录—令牌技术

这里写目录标题 令牌技术2.4.1 JWT令牌2.4.2 jwt使用 令牌技术 令牌&#xff0c;其实它就是一个用户身份的标识&#xff0c;其实本质就是一个字符串。 如果通过令牌技术来跟踪会话&#xff0c;就可以在浏览器发起请求。在请求登录接口的时候&#xff0c;如果登录成功&#xff…...

NPOI 操作详解(操作Excel)

目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式&#xff08;字体、边框、背景色等&#xf…...

2024年北京海淀区中小学生信息学竞赛校级预选赛试题

2024年北京海淀区中小学生信息学竞赛校级预选赛试题 题目总数&#xff1a;24 总分数&#xff1a;100 编程基础知识单选题 第 1 题 单选题 关于 2024年海淀区信息学竞赛的描述错误的是( ) A.报名在网上报名系统进行 B.必须经过学籍所在学校的指导教师审核 C.学校…...

GPT-SoVITS 部署方案

简介 当前主流的开源TTS框架&#xff0c;这里介绍部署该服务的主要流程和我在使用过程中出现的问题。 使用的技术 Docker、Jupyter、Python、C# 部署 docker的使用 拉取命令 docker pull jupyter/base-notebook:python-3.10.11jupyter的访问 docker运行以后可以直接使用…...

pdf添加目录标签python(手动配置)

先安装对应的库: pip install pypdf 代码分为两个部分,一部分是config.py,代码如下: offset=10 catgorys=[("第一章",12),("第二章",45), ] 需要自己手动更改offset,和目录列表 下面是主要代码: import pypdf # import sys from config import…...

Ngrok 在树莓派上的配置与使用教程

Ngrok 是一个便捷的工具&#xff0c;用于将本地服务器暴露到互联网上&#xff0c;常用于开发和调试。 1. 更新树莓派 首先&#xff0c;更新树莓派的系统&#xff1a; sudo apt update sudo apt upgrade -y2. 安装 Ngrok &#xff08;1&#xff09;下载 Ngrok&#xff1a; 访…...

多核架构的基本概念

目录 1.为什么使用多核 2.多核分类 2.1 同构和异构 2.2 SMP和AMP 3 小结 1.为什么使用多核 这个问题个人认为可以从两个方面来看&#xff1a; 性能问题 随着汽车ECU对集成化的要求越来越高&#xff0c;把多个ECU功能集中到一个多核MCU的需求也越来越明显。 以汽车制动…...

yolov8模型推理测试代码(pt/onnx)

&#x1f996;yolov8训练出来的模型&#xff0c;不使用detect.py代码进行模型测试&#x1f996; pt格式模型测试 import cv2 import os from ultralytics import YOLO # 定义输入和输出文件夹路径 input_folder /input/folder # 输入文件夹 output_folder /output/folder …...

二叉树 最大深度(递归)

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…...

C++详细笔记(五)

1.类和对象 1.1运算符重载&#xff08;补&#xff09; 1.运算符重载中&#xff0c;参数顺序和操作数顺序是一致的。 2.一般成员函数重载为成员函数&#xff0c;输入流和输出流重载为全局函数。 3.由1和2只正常的成员函数默认第一个参数为this指针而重载中参数顺序和操作数顺…...

简易CPU设计入门:译码模块(一)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…...

力扣题目解析--三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...