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

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式

什么是抽象工厂?

抽象工厂模式是一种创建型设计模式,让你能够保证在客户端程序中创建一系列有依赖的对象组时,无需关心这些对象的类型。

具体来说:

  • 对象的创建与使用分离: 抽象工厂模式通过引入抽象工厂接口以及具体工厂类,将对象的创建与使用分离开来。这使得客户端代码与具体的产品类解耦,提高了系统的灵活性和可维护性。
  • 产品族的创建: 在某些情况下,一个系统需要一组相关或相互依赖的对象,而不是单个对象。抽象工厂模式可以方便地创建整个产品族,确保这些对象之间的兼容性和一致性。
  • 更易于替换产品系列: 通过使用抽象工厂模式,可以轻松地替换整个产品系列,而无需修改客户端代码。只需要更改具体工厂的实现即可实现产品族的变更,这种灵活性对于系统的扩展和维护非常有用。
  • 隐藏实现细节: 抽象工厂模式隐藏了实际产品的创建细节,客户端只需与抽象工厂接口进行交互,而不必关心具体产品是如何创建的。这有助于保持代码的简洁性和可读性。

什么是工厂模式?

对于工厂模式和抽象工厂模式的区别,个人认为:
工厂模式——工厂和产品是一对一的关系,即每个工厂只负责一个产品。
抽象工厂模式——工厂和产品是一对多的关系,即每个工厂负责一个产品族。

C++实现一版抽象工厂的例子:

在这里插入图片描述

说明:(个人理解总结)

  • 将工厂抽象的意义:产品系列的划分由后端写入到实体工厂中,客户端只需感知一个抽象工厂接口(传给客户端什么实体工厂,客户端就用什么),需要产品时由工厂代为构建,客户端只管使用产品所提供的方法即可,无需关注产品属于哪个系列。实现客户端与具体产品的解耦。
  • 将产品抽象的意义:在客户端通过工厂创建出产品后,此时这个产品的系列是不确定的(系列取决于实体工厂中的指定),此时为了实现客户端与产品的解耦,需要用抽象产品引用或指针进行接收。
/*************************************************************************> File Name: AbstractFactory.cpp> Author:> Mail:> Created Time: Fri Mar  8 14:51:39 2024************************************************************************/#include <iostream>using namespace std;// Abstarct product(File)
class AbstractFile {
public:virtual ~AbstractFile() = default;virtual void f_open() = 0;
};class File_Linux : public AbstractFile {
public:void f_open() override {// The logic of opening files in Linux.cout << "Opening files successful in Linux !!!" << endl;return ;}
};class File_Windows : public AbstractFile {
public:void f_open() override {// The logic of opening files in Windows.cout << "Opening files successful in Windows !!!" << endl;return ;}
};// Abstract product(Process)
class AbstractProcess {
public:virtual ~AbstractProcess() = default;virtual void create() = 0;
};class Process_Linux : public AbstractProcess {
public:void create() override {// The logic of create process in Linux.cout << "Create process successful in Linux !!!" << endl;return ;}
};class Process_Windows : public AbstractProcess {
public:void create() override {// The logic of create process in Windows.cout << "Create process successful in Windows !!!" << endl;return ;}
};// Abstarct Factory(Creating Product)
class AbstractFactory {
public:virtual AbstractFile* CreateFile() = 0;virtual AbstractProcess* CreateProcess() = 0;
};class LinuxFactory : public AbstractFactory {
public:AbstractFile* CreateFile() override {return new File_Linux();}AbstractProcess* CreateProcess() override {return new Process_Linux();}
};class WindowsFactory : public AbstractFactory {
public:AbstractFile* CreateFile() override {return new File_Windows();}AbstractProcess* CreateProcess() override {return new Process_Windows();}
};void ClientCode(AbstractFactory *factoy_obj) {AbstractFile *file = factoy_obj->CreateFile();file->f_open();AbstractProcess *process = factoy_obj->CreateProcess();process->create();delete file;delete process;
};int main() {LinuxFactory ins_linux;ClientCode(&ins_linux);WindowsFactory ins_windows;ClientCode(&ins_windows);return 0;
}

相关文章:

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;让你能够保证在客户端程序中创建一系列有依赖的对象组时&#xff0c;无需关心这些对象的类型。 具体来说&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模…...

QT网络编程之实现UDP广播发送和接收

推荐一个不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;内容全面&#xff0c;作为入门科普和学习提升都不错&#xff0c;分享一下给大家&#xff1a;前言https://www.captainbed.cn/ai 一.UDP通信 1.QT中实现UDP通信主要用到了以下类&#xff1a;QUdpSocket、QHost…...

SSL VPN基础原理

目录 SSL ---安全传输协议&#xff08;安全套接层&#xff09;---TLS ----传输层安全协议 SSL的工作原理 SSL会话建立的过程 ​编辑 数据传输过程中的封装示意图 无客户端认证的过程 有客户端认证的过程 SSL VPN的核心技术---虚拟网关技术 服务器验证的点&#xff1a; 资源…...

深入理解FTP协议:文件传输的桥梁

深入理解FTP协议&#xff1a;文件传输的桥梁 在数字化时代&#xff0c;文件传输协议&#xff08;FTP&#xff09;是互联网上进行文件交换的重要手段。FTP允许用户在不同的计算机之间传输文件&#xff0c;无论是上传还是下载&#xff0c;都提供了一种稳定且高效的方式。本文将深…...

数字化转型导师坚鹏:金融机构数字化运营

金融机构数字化运营 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不清楚数字化运营对金融机构发展有什么影响&#xff1f; 不知道如何提升金融机构数字化运营能力&#xff1f; 不知道金融机构如何开展数字化运营工作&#xff1f; 课程特色&#xff1a;…...

一、C#冒泡排序算法

一、C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法&#xff0c;它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大&#xff08;或最小&#xff09;的元素逐步"冒泡"到数列的末尾。 实现原理 冒泡排序是一种简单的排序算法&#xff0c;其…...

docker部署mysql5

1. 进入面板 2. 新建挂载文件夹 新建三个文件夹: mkdir -p /docker/mysql5/config && mkdir -p /docker/mysql5/data && mkdir -p /docker/mysql5/logsconfig&#xff1a;存放mysql配置data&#xff1a;存放mysql数据logs&#xff1a;存放mysql记录日志 3.…...

Github 2024-03-15 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9非开发语言项目1TypeScript项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:OtherStar数量…...

SQLiteC/C++接口详细介绍之sqlite3类(六)

快速前往文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 19. sqlite3_changes与sqlite3_changes64 是SQLite中用…...

编码技巧:多条件判断拼接字符串

在写代码业务逻辑的时候&#xff0c;有时候需求稍微变化一下都让代码变的很麻烦&#xff0c;如果只在现有代码基础上硬改&#xff0c;可能会让可读性降低&#xff0c;本文通过一个例子来演示字符串拼接的变化。 一开始的业务逻辑比较简单&#xff0c;是固定条件加一个需要判断…...

气压计LPS25HB开发(1)----轮询获取气压计数据

气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…...

这个不需要吗 HttpServletRequest req

这个不需要吗 HttpServletRequest req 在这个特定场景下&#xff0c;您在OnlineStudentFeignService接口中确实不需要直接使用HttpServletRequest对象。因为Feign是一个声明式的HTTP客户端&#xff0c;它的设计目标是简化服务间的远程调用&#xff0c;它并不直接处理原始的HTT…...

【算法与数据结构】深入解析二叉树(一)

文章目录 &#x1f4dd;数概念及结构&#x1f320; 树的概念&#x1f309;树的表示&#x1f320; 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; &#x1f309;二叉树概念及结构&#x1f320;概念&#x1f309;数据结构中的二叉树&#x1f320;特殊的二叉…...

深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS

摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容&#xff0c;同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增&#xff0c;爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…...

Java日志框架Log4j 2详解

有时希望能够以文件的形式记录执行过程中出现的异常信息&#xff0c;甚至记录程序正常运行的关键步骤&#xff0c;以便日后查看&#xff0c;那么该如何处理呢? 答:显然&#xff0c;可以自行编程实现这个需求&#xff0c;但是&#xff0c;从更注重效率和性能的方面考虑&#x…...

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…...

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…...

git基础命令(二)

目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…...

从零开始学习typescript系列 1:typescript 基本了解之是什么,为什么,以及怎么用

初识ts 基本了解 设计者&#xff0c;实现者&#xff1a;微软发行时间&#xff1a;2012年10月1日GitHub&#xff1a;https://github.com/microsoft/TypeScriptts和js关系&#xff1a;ts是js的扩展&#xff0c;ts语法包含js ts是新语言吗&#xff1f; 不是&#xff0c;在js基…...

【数学建模】线性规划

针对未来可能的数学建模比赛内容&#xff0c;我对学习的内容做了一些调整&#xff0c;所以先跳过灰色关联分析和模糊综合评价的代码&#xff0c;今天先来了解一下运筹规划类——线性规划模型。 背景&#xff1a; 某数学建模游戏有三种题型&#xff0c;分别是A&#xff0c;B&am…...

2026论文降AI率必备清单:AI率92%暴降至5%!实测10款AI智能降重工具!学生党狂喜!

2026 年各大高校和期刊平台的 AI 检测系统又升级了&#xff0c;知网 AIGC、维普 AI、万方智能检测三大平台的算法迭代速度越来越快&#xff0c;上个月能蒙混过关的改写方式&#xff0c;这个月直接就会被标红预警。单纯的同义词替换、语序调整早就不管用了&#xff0c;想要有效降…...

初创公司如何利用Taotoken快速原型验证多个大模型能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初创公司如何利用Taotoken快速原型验证多个大模型能力 对于资源有限的初创团队而言&#xff0c;在产品原型阶段快速验证技术方案是…...

Arm功能安全编译器6.6文档体系与认证要点解析

1. Arm Compiler for Functional Safety 6.6文档体系解析在功能安全软件开发领域&#xff0c;工具链的可靠性和文档完整性直接关系到最终产品的认证通过率。Arm Compiler for Functional Safety 6.6作为面向汽车电子、工业控制等安全关键领域的专用工具链&#xff0c;其文档体系…...

软考 系统架构设计师之考试感悟5

接前一篇文章:软考 系统架构设计师之考试感悟4 今天(2026年05月23日),本人第五次参加了软考系统架构设计师的考试。一晃距离上次考试已经半年多了,感觉就像昨天一样。记得上一次考试结束后,直接去什刹海的南门涮肉和高中的兄弟们聚会,当天很嗨皮,一切仿佛刚刚过去一样。…...

k6性能测试实战:现代工程化压测方法论

1. 为什么是k6&#xff0c;而不是JMeter或Gatling&#xff1f;我第一次在生产环境压测中被JMeter拖垮&#xff0c;是在一个电商大促前夜。当时用20台云服务器搭起分布式集群&#xff0c;配置文件写了300多行&#xff0c;结果一跑起来内存飙到95%&#xff0c;GC频繁&#xff0c;…...

终极免费色彩校准方案:用novideo_srgb解决NVIDIA显卡广色域显示器色彩过饱和问题

终极免费色彩校准方案&#xff1a;用novideo_srgb解决NVIDIA显卡广色域显示器色彩过饱和问题 【免费下载链接】novideo_srgb Calibrate monitors to sRGB or other color spaces on NVIDIA GPUs, based on EDID data or ICC profiles 项目地址: https://gitcode.com/gh_mirro…...

LangGraph多智能体能力路由:动态专家选择与负载均衡

LangGraph多智能体能力路由&#xff1a;动态专家选择与负载均衡一、引言 钩子 你是否遇到过这种情况&#xff1a; 当你构建了一个由多个大模型或专业Agent组成的“超级团队”——有的精通数学推理、有的擅长代码生成、有的是情感分析小能手、还有的能写长篇技术文档——却发现整…...

茉莉花插件:3分钟搞定Zotero中文文献管理的完整指南

茉莉花插件&#xff1a;3分钟搞定Zotero中文文献管理的完整指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zotero无法…...

随机计算与ViT硬件加速:混合架构如何突破AI芯片能效墙

1. 项目概述&#xff1a;当ViT遇见随机计算最近在硬件加速领域&#xff0c;一个名为“ASCEND”的项目引起了我的注意。这本质上是一个专门为Vision Transformer&#xff08;ViT&#xff09;模型设计的硬件加速器&#xff0c;但其核心创新点在于采用了“随机计算”这种非常规的电…...

别再傻等下载了!手把手教你用wget离线部署sentence-transformers模型(以all-MiniLM-L6-v2为例)

离线部署sentence-transformers模型的终极指南&#xff1a;以all-MiniLM-L6-v2为例你是否曾在下载Hugging Face模型时遭遇网络中断&#xff0c;眼睁睁看着进度条卡在99%却无能为力&#xff1f;本文将彻底解决这一痛点&#xff0c;教你用wget命令行工具实现模型的离线部署。不同…...