【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;这样我…

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&…

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…

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;足以掏空老…

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

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

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;还考虑未来时刻的信息…

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

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

从理论到落地,大模型评测体系综合指南

1956年夏&#xff0c;“人工智能” 这一概念被提出。距今已有近70年的发展历史。中国科学院将其划分为六个阶段&#xff1a;起步发展期&#xff08;1956年—1960s&#xff09;&#xff0c;反思发展期&#xff08;1960s-1970s&#xff09;,应用发展期&#xff08;1970s-1980s),低…

LeetCode刷题--- 乘积为正数的最长子数组长度

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

Python爬虫实战第二例【二】

零.前言&#xff1a; 本文章借鉴&#xff1a;Python爬虫实战&#xff08;五&#xff09;&#xff1a;根据关键字爬取某度图片批量下载到本地&#xff08;附上完整源码&#xff09;_python爬虫下载图片-CSDN博客 大佬的文章里面有API的获取&#xff0c;在这里我就不赘述了。 一…

kitex 入门和基于grpc的使用

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于kitex系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系…

【Web】青少年CTF擂台挑战赛 2024 #Round 1 wp

好家伙&#xff0c;比赛结束了还有一道0解web题是吧( 随缘写点wp(简单过头&#xff0c;看个乐就好) 目录 EasyMD5 PHP的后门 PHP的XXE Easy_SQLi 雏形系统 EasyMD5 进来是个文件上传界面 说是只能上传pdf&#xff0c;那就改Content-Type为application/pdf&#xff0c;改…

11.盛最多水的容器

题目&#xff1a;给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 解题思路&#xff1a;可以…