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

设计模式学习(二)工厂模式——工厂方法模式

设计模式学习(二)工厂模式——工厂方法模式

  • 前言
  • 工厂方法模式
    • 简介
    • 示例
    • 优点
    • 缺点
    • 使用场景

前言

前一篇文章介绍了简单工厂模式,提到了简单工厂模式的缺点(违反开闭原则,扩展困难),本文要介绍的工厂方法模式在一定程度上弥补了简单工厂模式的缺点。

工厂方法模式

简介

工厂方法模式是创建型设计模式之一,它在抽象工厂类中声明创建对象的接口,在具体工厂类中实现具体的实例化过程。这个模式的核心思想是将对象的实例化延迟到子类中进行,从而使得父类通过其子类来指定创建哪个对象,实现了类的实例化操作的封装和数据的封装。

这样的话,当要添加一个具体产品时,我们不会修改原有的工厂类(不违反开闭原则),而是新创建一个关联于具体产品的具体工厂类(易扩展)。

示例

抽象相机类:CameraDevice
具体相机类:BaslerCameraDevice,SickCameraDevice,HuarayCameraDevice

抽象工厂类:CameraDeviceFactory
具体工厂类:BaslerCameraFactory,SickCameraFactory,HuarayCameraFactory

UML类图如下:
在这里插入图片描述

代码如下:

// 抽象产品类
class CameraDevice
{
public:CameraDevice() = default;virtual ~CameraDevice() = 0;virtual bool Init(){};virtual bool OpenDevice() = 0;
};class BaslerCameraDevice : public CameraDevice
{
public:~BaslerCameraDevice() override;bool Init() override{};bool OpenDevice() override{};
};class HuarayCameraDevice : public CameraDevice
{
public:~HuarayCameraDevice() override{};bool Init() override{};bool OpenDevice() override{};
};class SickCameraDevice : public CameraDevice
{
public:~SickCameraDevice() override{};bool Init() override{};bool OpenDevice() override{};
};// 抽象工厂类
class CameraDeviceFactory 
{
public:virtual std::shared_ptr<CameraDevice> CreateCamera() = 0;
};// 具体工厂类
class BaslerCameraFactory : public CameraDeviceFactory 
{
public:std::shared_ptr<CameraDevice> CreateCamera() override {return std::make_shared<BaslerCameraDevice>();}
};class HuarayCameraFactory : public CameraDeviceFactory 
{
public:std::shared_ptr<CameraDevice> CreateCamera() override {return std::make_shared<HuarayCameraDevice>();}
};class SickCameraFactory : public CameraDeviceFactory 
{
public:std::shared_ptr<CameraDevice> CreateCamera() override {return std::make_shared<SickCameraDevice>();}
};int main() 
{std::shared_ptr<CameraDeviceFactory> factory = std::make_shared<BaslerCameraFactory>();std::shared_ptr<CameraDevice> camera = factory->CreateCamera();camera->Init();camera->OpenDevice();return 0;
}

优点

  • 解耦:工厂方法模式可以减少客户代码与具体类之间的耦合。客户端在使用的时候只需知道接口,而不是具体类。这样可以更容易地扩展或修改创建逻辑,而无需修改现有客户代码。
  • 符合开闭原则:工厂方法模式允许系统在不修改现有代码的情况下引入新的类型。满足对扩展开放,对修改封闭的原则。
  • 单一职责原则:工厂方法模式中,创建对象的逻辑被封装在一个工厂类中,这符合单一职责原则。这让代码更加清晰,维护也更简单。

缺点

  • 代码复杂:工厂方法模式为每种产品类型提供一个单独的工厂类。这意味着每增加一个新的产品类别,就需要增加一个新的具体工厂类。这会导致类的数量迅速增加,从而增加了代码的复杂性
  • 代码冗余:如果具体工厂类之间的创建逻辑相似,这可能会导致代码冗余。虽然每个工厂类只负责创建一个具体产品,但这些工厂类的创建逻辑可能高度相似,不能有效地重用代码。

使用场景

  • 产品类别经常变化:一个系统会频繁添加或修改产品的创建,而每种产品的创建又有不同的复杂配置和依赖时,工厂方法可以将具体产品的创建逻辑封装在各自的工厂类中,从而简化客户端代码。

相关文章:

设计模式学习(二)工厂模式——工厂方法模式

设计模式学习&#xff08;二&#xff09;工厂模式——工厂方法模式 前言工厂方法模式简介示例优点缺点使用场景 前言 前一篇文章介绍了简单工厂模式&#xff0c;提到了简单工厂模式的缺点&#xff08;违反开闭原则&#xff0c;扩展困难&#xff09;&#xff0c;本文要介绍的工…...

TCP与UDP案例

udp不会做拆分整合什么的 多大就是多大...

Adaboost集成学习 | Matlab实现基于CNN-LSTM-Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料 效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于CNN-LSTM-Adaboost集成学习时间序列预测&#xff08;股票价格预测&#xff09; 模型设计 融合Adaboost的CNN-LSTM模型的时间序列预测&#xff0c;下面是一个基本的框架。 …...

你焦虑了吗

前段时间&#xff0c;无意间在图书馆看到一本书《认知觉醒》&#xff0c;书中提到了焦虑的相关话题&#xff0c;从焦虑的根源&#xff0c;焦虑的形式&#xff0c;如何破解焦虑给了我点启示&#xff0c;分享给一下。 引语&#xff1a; 焦虑肯定是你的老朋友了&#xff0c;它总像…...

一键分析Bulk转录组数据

我们前面介绍了经典的转录组分析流程&#xff1a;Hisat2 Stringtie&#xff0c;可以帮助用户快速获得基因的表达量矩阵。 云上生信&#xff0c;未来已来 | 转录组标准分析流程重磅上线&#xff01; RNA STAR 也是一款非常流行的转录组数据分析工具。它不仅可以将测序 Reads 比…...

Django DetailView视图

Django的DetailView是一个用于显示单个对象详情的视图。下面是一个使用DetailView来显示单个书籍详情的例子。 1&#xff0c;添加视图 Test/app3/views.py from django.shortcuts import render# Create your views here. from django.views.generic import ListView from .m…...

openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写

文章目录 openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写300.1 概述300.2 使用指导300.2.1 前提条件300.2.2 使用方法示例300.3 获取帮助300.4 命令参考300.5 常见问题处理openGauss学习笔记-300 openGauss AI特性-AI…...

typescript-泛型

typescript-泛型 泛型程序设计是一种编程风格或编程范式&#xff0c;允许在程序中定义形式类型参数&#xff0c;然后再泛型实例化时候使用实际类型参数来替代形式类型参数&#xff0c;通过泛型&#xff0c;可以定义通用的数据结构或类型&#xff0c;这种数据结构或类型仅仅再它…...

应急响应 | 基本技能 | 01-系统排查

系统排查 目录 系统基本信息 Windows系统Linux系统 用户信息 Windows系统 1、命令行方式2、图形界面方法3、注册表方法4、wmic方法 Linux系统 查看所有用户信息分析超级权限账户查看可登录的用户查看用户错误的登录信息查看所有用户最后的登录信息查看用户最近登录信息查看当…...

用c语言实现通讯录

目录 静态简易通讯录 代码&#xff1a; 功能模块展示&#xff1a; 设计思路&#xff1a; 动态简易通讯录&#xff08;本质顺序表&#xff09; 代码&#xff1a; 扩容模块展示&#xff1a; 设计思路&#xff1a; 文件版本通讯录 代码&#xff1a; 文件模块展示&#x…...

AI大模型技术揭秘-参数,Token,上下文和温度

深入理解 AI 大模型:参数、Token、上下文窗口、上下文长度和温度 人工智能技术的飞速发展使AI大模型大放异彩,其中涉及的“参数”、“Token”、“上下文窗口”、“上下文长度”及“温度”等专业术语备受瞩目。这些术语背后究竟蕴含何意?它们如何影响AI大模型的性能?一起揭开…...

攻防世界-fakebook题目__详解

1.打开题目先用dirsearch工具扫描一波&#xff0c;扫出来了robots.php目录&#xff0c;然后访问robots.txt 目录&#xff0c;发现了有一个备份文件 &#xff0c;访问备份文件&#xff0c;下载内容 文件的大致内容如下 里面有一个curl_exec这个函数容易造成ssrf攻击的漏洞 我…...

Ubuntu 18.04下普通用户的一次提权过程

Ubuntu 18.04下普通用户的一次提权过程 一.背景介绍:二.主要调试过程:三.相关命令:1.设置BMC密码,获取BMC IP2.找一台ubuntu搭建TFTP服务,用来替换grub.cfg文件3.从调试服务器的/boot/grub/grub.cfg中提取出recovery mode的配置,简化并生成新的配置文件grub.cfg,放在tftp服务的…...

接口和抽象类:如何使用普通类模拟接口和抽象类

目录 1.引言 2.抽象类和接口的定义与区别 3.抽象类和接口存在的意义 4.模拟实现抽象类和接口 5.抽象类和接口的应用场景 1.引言 在面向对象编程中&#xff0c;抽象类和接口是两个经常被提及的语法概念&#xff0c;也是面向对象编程的四大特性&#xff0c;以及很多设计模式…...

【文档智能】实践:基于Yolo三行代码极简的训练一个版式分析模型

一、数据集 本文以开源的CDLA数据集做为实验&#xff0c;CDLA是一个中文文档版面分析数据集&#xff0c;面向中文文献类&#xff08;论文&#xff09;场景。包含以下10个label&#xff1a; 数据集下载地址&#xff1a;https://github.com/buptlihang/CDLA 数据集是labelme格式…...

聚观早报 | 深蓝G318价格发布;比亚迪方程豹豹3官图发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月15日消息 深蓝G318价格发布 比亚迪方程豹豹3官图发布 夸克App升级高考AI搜索 iOS 18卫星通信实测 Redmi K70…...

如何实现内网穿透?快解析-免费内网穿透工具

在现如今的ipv4时代&#xff0c;随着上网电脑及其他智能设备越来越多&#xff0c;公网IP地址出现了枯竭的情况。近几年&#xff0c;内网穿透这个词被不断提及&#xff0c;这也是在无公网IP环境下实现异地访问的一种可行办法&#xff0c;下面我就给大家介绍一下内网穿透的原理。…...

【python-AI篇】人工智能技能树思维导图

大致总结一下得出如下思维导图&#xff0c;如不完善日后迭代更新 1. python基础三方库 1.1 科学计算库 ---- numpy库 1.2 科学计算库 ---- Scipy库 1.3 数据分析处理库 ---- pandas库 1.4 可视化库 ---- matplotlib库 1.5 可视化库 ---- seaborn库 1.6 机器学习和数据挖掘库 …...

Vue的computed大致细节

computed computed具体实现流程computer的执行顺序 computed 具体实现流程 computer内部首先是标准化参数然后调用runner函数进行依赖收集设置dirty为true创建副作用函数&#xff0c;具体如下 const runner effect(getter,{//延迟执行lazy:true,//标记为computed effect 用…...

第5章:模型预测控制(MPC)的代码实现

1. 建立 QP 模型&#xff1a; 1.1 车辆模型&#xff1a; 注&#xff1a;使用车辆横向动力学模型 纵向动力学模型&#xff08;误差模型&#xff09; 1.2 QP 问题模型&#xff1a; 注&#xff1a;详细推导见 笔记100&#xff1a;使用 OSQP-Eigen 对 MPC 进行求解的方法与代码-…...

论文学习day01

1.自我反思的检索增强生成&#xff08;SELF-RAG&#xff09; 1.文章出处&#xff1a; Chan, C., Xu, C., Yuan, R., Luo, H., Xue, W., Guo, Y., & Fu, J. (2024). RQ-RAG: Learning to Refine Queries for Retrieval Augmented Generation. ArXiv, abs/2404.00610. 2.摘…...

Github入门教程,适合新手学习(非常详细)

前言&#xff1a;本篇博客为手把手教学的 Github 代码管理教程&#xff0c;属于新手入门级别的难度。教程简单易操作&#xff0c;能够基本满足读者朋友日常项目寄托于 Github 平台上进行代码管理的需求。Git 与 Github 是一名合格程序员 coder 必定会接触到的工具与平台&#x…...

C# OpenCvSharp 代数运算-add、scaleAdd、addWeighted、subtract、absdiff、multiply、divide

在C#中使用OpenCvSharp进行图像处理时,理解和合理使用各种图像操作函数可以帮助我们实现许多实际应用中的需求。下面,我将详细介绍每个函数的使用,并给出与实际应用项目相关的示例,包括运算过程和运算结果。 1. add 函数 作用 将两幅图像进行相加,可以达到图像融合的目的…...

为什么说Python 是胶水语言?

​ "Python 是胶水语言"这一说法是指它很擅长将不同的程序或代码库连接在一起&#xff0c;能够让来自不同编程语言或框架的组件无缝协作。Python 具有丰富的库和简单的语法&#xff0c;使得它可以轻松调用其他语言编写的程序或使用不同技术栈的模块。 ​ 以下是几个…...

GitLab教程(二):快速上手Git

文章目录 1.将远端代码克隆到本地2.修改本地代码并提交到远程仓库3.Git命令总结git clonegit statusgit addgit commitgit pushgit log 首先&#xff0c;我在Gitlab上创建了一个远程仓库&#xff0c;用于演示使用Gitlab进行版本管理的完整流程&#xff1a; 1.将远端代码克隆到本…...

结构体知识点

基本概念 结构体是一种自定义变量类型&#xff0c;类似于枚举需要自己定义。 它是数据和函数的集合。 在结构体中&#xff0c;可以声明各种变量和方法。 基本语法 1.结构体一般写在namespace语句块中。 2.结构体关键字struct struct 自定义结构体名 {//第一部分//变量//…...

C# —— 显示转换

显示转换: 通过一些方法可以将其他数据类型转换为我们想要的数据类型 1.括号强转 作用: 一般情况下 将高精度的类型转换为低精度 // 语法: 变量类型 变量名 (转换的变量类型名称) 变量; // 注意: 精度问题 范围问题 sbyte sb 1; short s 1; int …...

zip加密txt文件后,暴力破解时会有多个解密密码可以打开的疑问??

最近在做一个关于zip压缩文件解密的测试&#xff0c;发现通过暴力解密时&#xff0c;会有多个解密密码可以打开&#xff0c;非常疑惑&#xff0c;这里做个问题&#xff0c;希望能有大佬解惑。 1、首先在本地创建一个113449.txt的文件&#xff0c;然后右键txt文件选择压缩&…...

css入门宝典

3.1.4 通配符选择器 语法 : *{} 作用 : 让页面中所有的标签执行该样式,通常用来清除间距 例子 : *{ margin: 0; //外间距 padding: 0; //内间距 } 一 CSS基本语法 1基础知识 1.1概述 Css (层叠样式表)是种格式化网页的标准方式&#xff0c; 用于控制设置网页的样式&#xff…...

【AI原理解析】— 星火大模型

目录 1. 模型基础架构 神经网络结构 编码器 解码器 多层神经网络结构 其他自然语言处理技术 2. 训练数据 来源 规模 3. 自监督学习 Masked Language Model (MLM) 4. 参数量与计算能力 大规模参数量 深度学习算法 5. 技术特点 多模态输入 自我学习与迭代 6. 应…...

wordpress网站怎么百度的到/网站流量排名查询工具

本文原址&#xff1a;http://www.hbzxr.com/web/36/2027736-1138928.htmljava this和super关键字 有什么作用成员函数中定义了和成员变量中相同的变量时&#xff0c;引用成员变量要用this. 构造函数中调用同一个类的其他构造函数时用this 子类中覆盖了于父类成员变量或成员函数…...

ins做甜品网站/百度关键词推广条件

据外媒报道&#xff0c;诺基亚为Reliance Jio&#xff08;Jio&#xff09;的泛印度4GLTE网络提供了最先进的光纤核心和城域解决方案&#xff0c;以处理由该运营商为印度所有地区建立宽带连接的举措而带来的巨大流量增长。 诺基亚跨越9万公里、也是全球最大的100G部署网络之一的…...

长沙seo关键词/seo站内优化教程

转载地址&#xff1a;http://developer.51cto.com/art/200906/127169.htm 尚未一一验证。 eclipse插件大全介绍&#xff0c;以及下载地址 Eclipse及其插件下载网址大全 1 Eclipse下载 EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载 http://www.ec…...

软件定制和开发/安卓神级系统优化工具

转自&#xff1a;mysql有关权限的表都有哪几个一、关于MySQL权限的几点常识&#xff1a;1、MySQL的权限系统主要用来验证用户的操作权限。2、在MySQL内部&#xff0c;权限信息存放在MySQL数据库的granttable里。当mysql启动后&#xff0c;granttabhttps://www.pinlue.com/artic…...

郑州网站建设首选创新/培训机构好还是学校好

配置一个数据源 Spring在第三方依赖包中包含了两个数据源的实现类包&#xff0c;其一是Apache的DBCP&#xff0c;其二是 C3P0。可以在Spring配置文件中利用这两者中任何一个配置数据源。 DBCP数据源 DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar&#xff0c;DB…...

网站自响应/今日头条指数查询

该文章阅读需要8分钟,更多文章请点击本人博客halu886 1.原生函数基本概念 1.1原生函数是什么1.2作用是什么1.3补充2.[[class]]3.封装对象包装4.拆封1.原生函数基本概念 1.1原生函数是什么 JavaScript为基本数据类型提供了封装对象,被称为原生函数(native function),同时也叫内建…...