【c++设计模式05】创建型3:抽象工厂模式(Abstact Factory Pattern)

【c++设计模式05】创建型3:抽象工厂模式(Abstact Factory Pattern)

  • 一、工厂模式
  • 二、抽象工厂模式
  • 三、UML类图
  • 四、demo
  • 五、总结

原创作者:郑同学的笔记
原创地址:https://zhengjunxue.blog.csdn.net/article/details/132306496
qq技术交流群:921273910

类型序号设计模式描述
创建型1简单工厂模式
(Simple Factory Pattern)
通过一个工厂类负责创建所有产品的实例
2工厂方法模式
(Factory Pattern)
将对象的实例化延迟到子类中实现
3抽象工厂模式
(Abstact Factory Pattern)
通过提供一组相关产品的接口,实现了一系列具体工厂类来创建不同产品族的实例
4单例模式
(Singleton Pattern)
保证一个类只有一个实例
5创建者模式
(Builder Pattern)
如何创建一个组合对象
6原型模式
(Prototype Pattern)
它通过复制已有对象来创建新的实例

一、工厂模式

  • 工厂模式是一种软件设计模式,它提供了一种创建对象的方式,将对象的实例化和使用分离开来。工厂模式通过定义一个公共的接口或抽象类来创建对象,并由实现该接口或继承该抽象类的具体工厂类负责实例化对象。

  • 在工厂模式中,客户端通过调用工厂类的方法来获取所需的对象,而无需直接实例化对象。工厂类根据不同的需求条件,使用不同的逻辑或算法创建相应的对象,隐藏了对象创建的具体细节。

  • 工厂模式可以有效地降低系统的耦合度,提高代码的可维护性和可扩展性。它符合面向对象设计原则中的开放封闭原则,即对扩展开放,对修改封闭。当需要新增一种产品时,只需添加相应的具体产品类和对应的工厂类,而无需修改已有的代码。

  • 常见的工厂模式包括简单工厂模式工厂方法模式抽象工厂模式
    简单工厂模式通过一个工厂类负责创建所有产品的实例;
    工厂方法模式将对象的实例化延迟到子类中实现;
    抽象工厂模式通过提供一组相关产品的接口,实现了一系列具体工厂类来创建不同产品族的实例。

二、抽象工厂模式

工厂模式里面,只有苹果、香蕉,实际情况可能更加的复杂,比如苹果也有不同的国家生成的,比如

水果\国家中国美国
苹果中国苹果美国苹果
香蕉中国香蕉美国香蕉

在抽象工厂模式中,除了有产品的抽象类(Apple和Banana),还有一个抽象的工厂类(Factory)。工厂类定义了一个或多个用于创建不同类别产品的纯虚函数,其中每个纯虚函数对应一个具体的产品。在这段代码中,Factory类中的createApple()和createBanana()函数就是抽象工厂方法。

然后通过具体的工厂类(ChinaFactory和USAFactory)继承抽象工厂类,并实现了抽象工厂类中的纯虚函数,这些具体的工厂类分别负责创建中国水果和美国水果的对象。

抽象工厂模式的优点是可以确保客户端只能访问抽象接口,而不用担心具体的产品类。它提供了一种灵活的方式来创建相关的产品族,且易于替换不同的具体工厂类。缺点是当需要添加新的产品类时,需要修改抽象工厂和所有的具体工厂类,违反了开闭原则。

总结来说,抽象工厂模式是一种创建一族相关对象的设计模式,通过定义抽象的工厂类和产品类,以及具体的工厂类的组合,实现了对象的创建与客户端的解耦。这种模式在需要创建一系列相关对象时非常有用,可以根据不同的具体工厂类来创建不同产品族的对象。

三、UML类图

  • 当然,苹果和香蕉也可以同时继承一个水果类,但是我们这里用不到,就不画了。
  • 抽象工厂模式AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。
    在这里插入图片描述

四、demo

#include<iostream>
using namespace std;class Apple {
public:virtual void say() {};virtual ~Apple() {};
};
class Banana {
public:virtual void say() {};virtual ~Banana() {};
};
class ChinaApple : public Apple {
public:void say() override{cout << "i am a China Apple\n";}
};
class ChinaBanana : public Banana {
public:void say(){cout << "i am a china Banana\n";}
};class USAApple : public Apple {
public:void say() override{cout << "i am a USA Apple\n";}
};
class USABanana : public Banana {
public:void say(){cout << "i am a USA Banana\n";}
};class Factory {
public:virtual Apple* createApple() = 0;virtual Banana* createBanana() = 0;virtual ~Factory() {};
};class USAFactory:public Factory {
public:Apple* createApple() override{return new USAApple;}Banana* createBanana() override {return new USABanana;}
};class ChinaFactory :public Factory {
public:Apple* createApple() override {return new ChinaApple;}Banana* createBanana() override {return new ChinaBanana;}
};int main()
{Factory* factory = new ChinaFactory();Apple* obj = factory->createApple();obj->say();factory = new USAFactory();Banana* obj2 = factory->createBanana();obj2->say();return 0;
}

输出

在这里插入图片描述

五、总结

AbstractFactory 模式和 Factory模式的区别是初学(使用)设计模式时候的一个容易引起困惑的地方。实际上,AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而 Factory模式是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到,AbstractFactory模式通常都是使用 Factory 模式实现。

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

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

相关文章

Spring 源码解析

文章目录 前言相关Spring的定义接口整体代码StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh")prepareRefresh()obtainFreshBeanFactory()registerBeanPostProcessors(beanFactory)SpringAOP原码流程EnableAspectJAutoProxyAnno…

Linux调试器-gdb使用与冯诺依曼体系结构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 Linux调试器-gdb使用 1. 背景 2. 开始使用 冯诺依曼体系结构 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升起的太阳&#xff0c;一种是正在努力学…

计算机网络-网络互连和互联网(五)

1.路由器技术NAT&#xff1a; 网络地址翻译&#xff0c;解决IP短缺&#xff0c;路由器内部和外部地址进行转换。静态地址转换&#xff1a;静态NAT&#xff08;一对一&#xff09; 静态NAT&#xff0c;内外一对一转换&#xff0c;用于web服务器&#xff0c;ftp服务器等固定IP的…

(定时器/计数器)中断系统(详解与使用)

讲解 简介 定时器/计数器 定时器实际上也是计数器,只是计数的是固定周期的脉冲 定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。 定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值…

C++:String类的使用

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 在C语言中&#xff0c;我们想要存储字符串的话必须要用字符数组 char str[]"hello world"这其实是将在常量区的常量字符串拷贝到数组中&#xff0c;我们会在数组的结尾多开一个空间存储\0&#xff0c;这样我…

前端构建之CERT_HAS_EXPIRED和certificate has expired解决方案

问题 2024年 1 月 22 日&#xff0c;淘宝原镜像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 证书正式到期。如果想要继续使用&#xff0c;需要将 npm 源切换到新的源&#xff08;registry.npmmirror.com&#xff09;&#xff0c;否则会报错。 报错信息为&a…

Consul服务注册与发现 Consul配置步骤

Consul服务注册与发现 Consul配置步骤 consul下载地址 Install | Consul | HashiCorp Developer 启动需要在 下载好的文件夹里 用cmd 运行consul agent -dev启动consul Consul配置 配置pom <!--SpringCloud consul config--> <dependency><groupId>org…

【leetcode】回文子串 动态规划

/*** param {string} s* return {number}*/ var countSubstrings function(s) {let dpnew Array(s.length).fill().map(()>new Array(s.length).fill(false));let num0;for(let i0;i<s.length;i){for(let j0;j<i;j){//在首尾相等时&#xff0c;如果长度时1或者2&…

C++笔记(三)--- 函数重载

目录 子类继承父类重载 类成员函数重载 继承和组合的三种方式请看我上一篇文章 C笔记&#xff08;二&#xff09;--- 继承和组合-CSDN博客 子类继承父类重载 当子类继承父类之后&#xff0c;子类重新定义了一个和父类完全相同函数名称的函数时&#xff0c;会将父类所有相同…

Pegasus智能家居套件样例开发--软定时器

样例简介 此样例将演示如何在Pegasus Wi-Fi IoT智能家居套件上使用cmsis 2.0 接口进行定时器开发。 工程版本 系统版本/API版本&#xff1a;OpenHarmony 3.0 releaseIDE版本&#xff1a;DevEco Device Tool Release 3.0.0.401 快速上手 准备硬件环境 预装windows系统的PC…

『大模型笔记』RAG应用的12种调优策略指南

RAG应用的12种调优策略指南 文章目录 一. 概要二. 数据索引2.1. 数据清洗2.2. 分块2.3. 嵌入模型2.4. 元数据(或未向量化的数据)2.5. 多索引2.6. 索引算法三. 推理阶段(检索和生成)3.1. 检索参数3.2. 高级检索策略3.3. 重新排序模型3.5. 大语言模型(LLM)

26、Qt调用.py文件中的函数

一、开发环境 Qt5.12.0 Python3.7.8 64bit 二、使用 新建一个Qt项目&#xff0c;右击项目名称&#xff0c;选择“添加库” 选择“外部库”&#xff0c;点击“下一步” 点击“浏览”&#xff0c;选择Python安装目录下的libs文件夹中的“python37.lib”文件&#xff0c;点击“下…

退休开便利店真的靠谱吗?2024比较赚钱的创业项目排行

近日多个退休后开便利店赚钱的新闻登上热搜&#xff0c;但是&#xff0c;小编对此有疑问&#xff0c;退休的老年人开便利店真的是一个好选择吗&#xff1f; 第一、便利店最基本的转让费&#xff0c;装修费&#xff0c;进货等等&#xff0c;这笔开支非常大&#xff0c;足以掏空老…

H5下拉刷新分页

对于分页需求&#xff0c;分页数据的请求触发十分重要&#xff0c;监听滑动到底的触发也有很多种。 1.IntersectionObserver监听 IntersectionObserver 接口&#xff08;从属于 Intersection Observer API&#xff09;提供了一种异步观察目标元素与其祖先元素或顶级文档视口&a…

终结数据混乱!开发者必学的GraphQL秘籍,高效API只需一步

在数字世界中&#xff0c;API就如同城市中的道路&#xff0c;连接着各种服务和数据。然而&#xff0c;传统的API&#xff08;如RESTful&#xff09;虽然功不可没&#xff0c;但随着技术复杂性和需求多样性不断攀升&#xff0c;它们显露出的局限性也呼唤着新的可能出现。此时&am…

Unity中,activeInHierarchy 和 activeSelf

activeInHierarchy&#xff1a; activeInHierarchy 属性表示游戏对象是否在场景中处于激活状态&#xff0c;并且是否在层次结构中的激活状态。它考虑了游戏对象以及其所有父对象的激活状态。如果 activeInHierarchy 为 true&#xff0c;表示该对象在场景中处于激活状态且其所有…

LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

《PyTorch深度学习实践》第十三讲RNN进阶

一、 双向循环神经网络&#xff08;Bidirectional Recurrent Neural Network&#xff0c;BiRNN&#xff09;是一种常见的循环神经网络结构。与传统的循环神经网络只考虑历史时刻的信息不同&#xff0c;双向循环神经网络不仅考虑历史时刻的信息&#xff0c;还考虑未来时刻的信息…

wireshark过滤和tcpdump抓包指令

Wireshark 过滤器的表达式&#xff0c;用于过滤源 IP 地址为 10.184.148.247 并且目标 TCP 端口为 1883 的数据包。启用抓包后过滤 ip.addr 10.184.148.247 && tcp.port 1883 主机位10.184.148.19和目标端口为 8080 的操作目标 抓包前过滤 host 10.184.148.19 &…

软件说明书怎么写?终于有人一次性说清楚了!

每次写软件说明书&#xff0c;你是不是总是毫无头绪&#xff0c;不知道从何下手&#xff1f;到各网站找资料&#xff0c;不仅格式不规范&#xff0c;甚至可能遗漏关键内容&#xff01;挨一顿批不说&#xff0c;还浪费大把时间。别着急&#xff0c;编写软件说明书&#xff0c;关…