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

C++设计模式之工厂模式(下)——抽象工厂模式

抽象工厂模式

  • 介绍
  • 示例
  • 示例使用
  • 运行结果
  • 抽象工厂模式的优缺点
    • 优点
    • 缺点
  • 总结

介绍

抽象工厂模式是一种创建型设计模式,它提供了一种封装一组相关或相互依赖对象的方式,而无需指定它们具体的类。它允许客户端使用抽象接口来创建一系列相关的对象,而不必关心其实际的实现细节。

在抽象工厂模式中,存在一个抽象工厂类,该类定义了一组创建对象的方法,这些方法可以创建一系列相关的对象,包括产品对象和工厂对象。由于这些对象都是通过一个抽象接口来创建的,因此它们的具体实现可以被隐藏在实际工厂类的后面。客户端只需要使用抽象工厂类来创建对象,而无需关心它们的实际实现。(理解这个很重要,就是多态的应用)

通过使用抽象工厂模式,我们可以实现高层模块的隔离和解耦,从而使系统更加灵活和可扩展。它还具有高度的封装性,可以隐藏底层实现细节,提高系统的安全性和稳定性。但是它的缺点是增加了系统的复杂性,需要定义更多的抽象类和接口,会增加系统的开发和维护的难度。

示例

这里依旧在之前两篇工厂模式的基础之上,进行改进。
这里客户需要工厂生产塑料的笔筒和铁制笔筒,另外还想生产塑料剑和铁制的剑。
下面是示例代码:

class Sword //剑
{
public:virtual void play() = 0;
};class PlasticSword :public Sword //塑料剑
{
public:void play()override {cout << "塑料剑舞动!!" << endl;}
};class IronSword :public Sword //铁制剑
{
public:void play()override {cout << "铁制剑舞动!!" << endl;}
};class AbstractFactory 
{
public:virtual PenHolder* createPenHolder() = 0;virtual Sword* createSword() = 0;
};class ProductPlasticFactory :public AbstractFactory 
{
public:PenHolder *createPenHolder()override {return new PlasticPenHolder;}Sword* createSword()override {return new PlasticSword;}
};class ProductIronFactory :public AbstractFactory 
{
public:PenHolder* createPenHolder()override {return new IronPenHolder;}Sword* createSword()override {return new IronSword;}
};

示例使用

int main() 
{AbstractFactory *factory1 = new ProductPlasticFactory;PenHolder*pen_Holder1= factory1->createPenHolder();Sword* sword1 =  factory1->createSword();pen_Holder1->introduce();sword1->play();delete factory1;delete pen_Holder1;delete sword1;AbstractFactory *factory2 = new ProductIronFactory;PenHolder* pen_Holder2 = factory2->createPenHolder();Sword* sword2 = factory2->createSword();pen_Holder2->introduce();sword2->play();delete factory2;delete pen_Holder2;delete sword2;return 0;
}

运行结果

在这里插入图片描述

抽象工厂模式的优缺点

优点

1.分离接口和实现:客户端代码只需要使用抽象工厂和抽象产品,不需要关注具体实现,降低了客户端与具体实现的耦合度,提高了代码的可维护性和可扩展性。

2.符合开闭原则:通过增加具体工厂和具体产品的实现,可以增加新的功能和新的产品,而不需要修改代码。(这里只是针对现有的产品种类而言,随着新产品的增加,需要修改抽象工厂的接口,继而也需要修改子工厂的接口,这样就破坏了开放封闭原则。)

3.保持一致性:抽象工厂模式可以保证一组产品的一致性,使得它们在逻辑上或者物理上都相互配合,满足一定的约束条件。

缺点

1.增加复杂度:引入抽象工厂和多个抽象产品的层次结构,增加了系统的复杂度,增加了开发难度。

2.不易扩展:一旦增加了一个新的产品族,就需要修改抽象工厂和所有的具体工厂和产品,对系统的维护和扩展带来了一定的困难。

3.限制产品族内的产品等级结构:由于抽象工厂只定义了一组产品的创建接口,因此它限制了具体产品等级结构的扩展,只能在产品族内扩展产品。

总结

抽象工厂设计模式确实很抽象,所以需要慢慢领悟,多悟几次,然后再后期的开发中就可以融进自己的项目中,提高程序的封装性,安全性,但复杂性也随之增加。

相关文章:

C++设计模式之工厂模式(下)——抽象工厂模式

抽象工厂模式 介绍示例示例使用运行结果抽象工厂模式的优缺点优点缺点 总结 介绍 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种封装一组相关或相互依赖对象的方式&#xff0c;而无需指定它们具体的类。它允许客户端使用抽象接口来创建一系列相关的对象&#xff…...

2023亚太杯数学建模A题思路分析 - 采果机器人的图像识别技术

1 赛题 问题A 采果机器人的图像识别技术 中国是世界上最大的苹果生产国&#xff0c;年产量约为3500万吨。与此同时&#xff0c;中国也是世 界上最大的苹果出口国&#xff0c;全球每两个苹果中就有一个&#xff0c;全球超过六分之一的苹果出口 自中国。中国提出了一带一路倡议…...

关于Flink的旁路缓存与异步操作

1. 旁路缓存 1. 什么是旁路缓存? 将数据库中的数据,比较经常访问的数据,保存起来,以减少和硬盘数据库的交互 比如: 我们使用mysql时 经常查询一个表 , 而这个表又一般不会变化,就可以放在内存中,查找时直接对内存进行查找,而不需要再和mysql交互 2. 旁路缓存例子使用 dim层…...

MyBatis-Plus的分页插件和乐观锁插件

MyBatis-Plus: 探索分页查询和乐观锁插件 在现代的Web应用开发中&#xff0c;高效的数据处理是不可或缺的一部分。MyBatis-Plus&#xff0c;作为MyBatis的增强版&#xff0c;提供了多种插件来简化和优化数据库操作。在这篇博客中&#xff0c;我们将重点介绍两个非常实用的插件…...

批量将本地N个英文Html文档进行中文翻译-操作篇

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

解决cad找不到vcruntime140.dll的方法,实测有效的5个的方法

最近&#xff0c;我在使用CAD软件时遇到了一个困扰我已久的问题&#xff1a;由于找不到vcruntime140.dll文件而导致CAD无法正常运行。经过一番努力和尝试&#xff0c;我终于找到了解决这个问题的方法。那么&#xff0c;如何解决vcruntime140.dll丢失的问题呢&#xff1f;本文将…...

2023亚太杯数学建模C题:我国新能源电动汽车的发展趋势,思路模型代码

问题C 我国新能源电动汽车的发展趋势 赛题思路&#xff1a;获取思路见文末名片&#xff0c;第一时间更新 新能源汽车是指以先进技术原理、新技术、新结构的非常规汽车燃料为动力来源( 非常规汽车燃料指汽油、柴油以外的燃料&#xff09;&#xff0c;将先进技术进行汽车动力控制…...

英语学习-爆破音

英文爆破音有&#xff1a;[p],[b],[t],[d],[k],[g]。 同时爆破音的发音会根据前后音的不同&#xff0c;发音不同&#xff0c;具体如下&#xff1a; ⒈ [p],[b],[t],[d],[k],[g] 中的任何两个音素相邻时&#xff0c;前面的发不完全爆破音&#xff0c;后面的就要完全地爆破。如…...

【Vue】图片切换

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所需要的指令有&#xff1a; v-on v-bind v-show <!DOCTYPE html> <html lang"en"> <head><meta charset"…...

C++模拟如何实现vector的方法

任意位置插入&#xff0c;insert的返回值为新插入的第一个元素位置的迭代器&#xff1b;因为插入可能会进行扩容&#xff0c;导致start的值改变&#xff0c;所以先定义一个变量保存pos与start的相对位置&#xff1b;判断是否需要扩容&#xff1b;从插入位置开始&#xff0c;将所…...

芯知识 | 混音播报语音芯片的优势:革新音频应用的新力量

随着科技的进步&#xff0c;语音芯片在各个领域的应用越来越广泛。而在众多语音芯片中&#xff0c;混音播报语音芯片以其独特的优势&#xff0c;正逐渐成为音频应用领域的翘楚。本文将重点探讨混音播报语音芯片的优势及其在现代科技应用中的价值。 一、混音播报语音芯片概述 …...

Arduino驱动PT100数字K型高温传感器(温湿度传感器)

目录 1、传感器特性 2、控制器和传感器连线图 3、硬件原理图 4、驱动程序 PT100适用于大部分400℃以下高温的测量,但是通常家用天然气灶焰芯温度可达800℃以上,烧制陶瓷的窖子或者大功率电炉温度更可超过1000℃,在这些超高温度的场景下就需要用到K型热电偶。...

【C/PTA —— 11.函数2(课外实践)】

C/PTA —— 11.函数2&#xff08;课外实践&#xff09; 一.函数题6-1 计算A[n]1/(1 A[n-1])6-2 递归实现顺序输出整数6-3 自然数的位数(递归版)6-4 分治法求解金块问题6-5 汉诺塔6-6 重复显示字符(递归版)6-7 显示平行四边形(右)(递归版) 二.编程题7-2 N阶楼梯上楼问题 一.函数…...

2023 Unite 大会关于“Muse“ AI 大模型训练

Unity Muse 借助强大的 AI 能力帮助你探索、构思和迭代&#xff0c;其中包括纹理和精灵两项功能&#xff0c;可将自然语言和视觉输入转化为可用资产。 将 AI 引入 Unity Editor 中的 Muse 提供了更快将想法转化为实物的选项。您可以调整并使用文本提示、图案、颜色和草图&…...

Day28|Leetcode 93. 复原 IP 地址 Leetcode 78. 子集 Leetcode 90. 子集 II

Leetcode 93. 复原 IP 地址 题目链接 93 复原 IP 地址 本题目也是分割的典型题目&#xff0c;属于分割回文子串的升级版&#xff0c;大概的思路都是一样的&#xff0c;注意几点&#xff0c;第一个是对ip地址正确与否的条件&#xff0c;第二个插入逗点后&#xff0c;下一个子串…...

【Java 进阶篇】Jedis 操作 String:Redis中的基础数据类型

在Redis中&#xff0c;String是最基础的数据类型之一&#xff0c;而Jedis作为Java开发者与Redis交互的利器&#xff0c;提供了丰富的API来操作String。本文将深入介绍Jedis如何操作Redis中的String类型数据&#xff0c;通过生动的代码示例和详细的解释&#xff0c;让你轻松掌握…...

MySQL 8 配置文件详解与最佳实践

MySQL 8 是一款强大的关系型数据库管理系统&#xff0c;通过适当的配置文件设置&#xff0c;可以充分发挥其性能潜力。在这篇博客中&#xff0c;我们将深入探究 MySQL 8 常用的配置文件&#xff0c;并提供一些建议&#xff0c;帮助您优化数据库性能。 配置文件概览 在 MySQL …...

K8s client go 创建CRD的informer

背景 需要监听K8s中CRD资源的变动, 做出相应的处理, 需要针对 CRD资源建立informer 实现 dynamicClient 是 创建的K8s的client, 这里使用的是 Unstructured 接収的CRD的结果, 加工的时候使用了convertUnstructuredProject 加工了一下, convertUnstructuredProject 实现下面提…...

使用jmx_exporter监控Kafka

prometheus 监控 kafka 常见的有两种开源方案,一种是传统的部署 exporter 的方式,一种是通过 jmx 配置监控,本文将采用第二种方式进行配置。 项目地址: kafka_exporter:https://github.com/danielqsj/kafka_exporterjmx_exporter:https://github.com/prometheus/jmx_expo…...

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...