【c++设计模式03】创建型1:简单工厂模式(Simple Factory Pattern)

【c++设计模式03】创建型1:简单工厂模式(Simple Factory Pattern)

  • 一、工厂模式
  • 二、简单工厂模式
  • 三、UML类图
  • 四、demo
  • 五、使用多态的简单工厂模式
    • 1、UML类图——使用多态
    • 2、demo——使用多态

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

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

一、工厂模式

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

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

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

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

二、简单工厂模式

基于简单工厂模式去创建对象的时候,需要提供一个工厂类,专门用于生产需要的对象,这样关于对象的创建操作就被剥离出去了。

简单工厂模式相关类的创建和使用步骤如下:

  • 创建一个新的类, 可以将这个类称之为工厂类。对于简单工厂模式来说,需要的工厂类只有一个。
  • 在这个工厂类中添加一个公共的成员函数,通过这个函数来创建我们需要的对象,关于这个函数一般将其称之为工厂函数。
  • 关于使用,首先创建一个工厂类对象,然后通过这个对象调用工厂函数,这样就可以生产出一个指定类型的实例对象了。

三、UML类图

在这里插入图片描述

四、demo

#include<iostream>
using namespace std;class Apple {
public:void say(){cout << "i am a Apple\n";}
};
class Banana {
public:void say(){cout << "i am a Banana\n";}
};enum class Type :char {APPLE,BANAN
};
class SimpleFactory {
public:void* createFruit(Type type) {void* ptr = nullptr;switch (type){case Type::APPLE:ptr = new Apple();break;case Type::BANAN:ptr = new Banana();break;default:cout << "水果类型错误\n";break;}return ptr;}
};int main()
{SimpleFactory* factory = new SimpleFactory();Apple* apple1 =(Apple*)factory->createFruit(Type::BANAN);apple1->say();Banana* banana1 = (Banana*)factory->createFruit(Type::APPLE);banana1->say();return 0;
}

输出

在这里插入图片描述

  • 关于水果的类型,上面的类中用到了强类型枚举(C++11新特性),增强了代码的可读性,并且将枚举元素设置为了char类型,节省了内存。
  • 函数createFruit(Type type)的返回值是void*类型,这样处理主要是因为每个case 语句创建出的对象类型是不一样的,为了实现兼容,故此这样处理。
  • 得到函数createFruit(Type type)的返回值之后,还需要将其转换成实际的类型,处理起来还是比较繁琐的。

五、使用多态的简单工厂模式

类和类之间有继承关系。
父类中有虚函数,并且在子类中需要重写这些虚函数。
使用父类指针或引用指向子类对象。

1、UML类图——使用多态

我们需要给苹果、香蕉提供一个基类,然后让上边的2个类Apple、Banana作为子类继承这个基类。根据分析我们就有画出简单工厂模式的UML类图了:
在这里插入图片描述

2、demo——使用多态

由于水果和苹果、香蕉有继承关系, 并且实现了多态,所以父类的析构函数也应该是虚函数,这样才能够通过父类指针或引用析构子类的对象。

#include<iostream>
using namespace std;class AbstractFruit {
public:virtual void say() {};virtual ~AbstractFruit() {};
};
class Apple: public AbstractFruit {
public:void say() override{cout << "i am a Apple\n";}
};
class Banana : public AbstractFruit {
public:void say(){cout << "i am a Banana\n";}
};enum class Type :char {APPLE,BANAN
};
class SimpleFactory {
public:AbstractFruit* createFruit(Type type) {AbstractFruit* ptr = nullptr;switch (type){case Type::APPLE:ptr = new Apple;break;case Type::BANAN:ptr = new Banana();break;default:cout << "水果类型错误\n";break;}return ptr;}
};int main()
{SimpleFactory* factory = new SimpleFactory();AbstractFruit* obj = factory->createFruit(Type::BANAN);obj->say();return 0;
}

工厂函数createFruit(Type type)的返回值修改成了AbstractFruit*类型,这是水果类的基类,通过这个指针保存的是子类对象的地址,这样就实现了多态,所以在main()函数中,通过obj对象调用的实际是子类say中的函数,因此打印出的信息应该是这样的:

输出

在这里插入图片描述

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

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

相关文章

GAN:“左右互搏”的卷积网络,不断优化性能中

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 在一个名为“卷王”的世界里&#xff0c;有一个传奇般的存在——生成对抗网络&#xff…

解释器设计模式

解释器设计模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种语言的文法&#xff0c;并建立一个解释器来解释该语言中的句子。这种模式通常用于需要解释或执行一种特定类型的语言的场景&#xff0c;例如编程语言的编译器或解释器、…

17. 【Linux教程】查看文件内容

前面小节介绍了文件和目录相关的操作&#xff0c;本小节介绍如何使用 file、cat、more、tail 命令在不同场景下去查看文件相关信息和内容。 1. file 查看文件类型 file 命令可以用来查看文件类型&#xff0c;还能查看文件的编码格式&#xff0c;下面列举一些 file 命令的参数&…

文件上传漏洞--Upload-labs--Pass04--.htaccess绕过

一、什么是 .htaccess 文件 1、官方解释&#xff1a; .htaccess文件主要用于控制Web服务器&#xff08;如Apache&#xff09;的配置&#xff0c;使得无需修改主服务器配置文件即可对特定目录进行访问控制和功能设置。 2、通俗解释&#xff1a; 现有一份 写有恶意代码的 .ph…

[力扣 Hot100]Day28 两数相加

题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系&#xff0c;把每日所学的知识梳理出来&#xff0c;既能够当作读书笔记&#xff0c;又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念&#xff1a;信源、信道、信宿&…

【LeetCode: 589. N 叉树的前序遍历 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

NBA2K24 精品蔡徐坤面补

NBA2K24 精品蔡徐坤面补 NBA2K23-NBA2K24通用 精品蔡徐坤面补 下载地址&#xff1a; https://www.changyouzuhao.cn/13072.html

找座位 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 在一个大型体育场内举办了一场大型活动&#xff0c;由于疫情防控的需要&#xff0c;要求每位观众的必须间隔至少一个空位才允许落座。 现在给出一排观众座位分布…

Nginx 正向代理、反向代理

文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题&#xff1b;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 从前的日色变得慢&#xff0c;车&#xff0c;马&#xff0c;邮件都慢&#xff0c;一生,只够爱一个人。 概述 二叉树的层序遍历可以使用广度优先搜索&#xff08;BFS&#xff09;来实现。具体步骤如下&…

LiveGBS流媒体平台GB/T28181常见问题-基础配置流媒体服务配置中本地|内网IP外网IP(可选)外网IP收流如何配置

LiveGBS常见问题基础配置流媒体服务配置中本地|内网IP外网IP外网IP收流如何配置&#xff1f; 1、流媒体服务配置2、播放提示none rtp data receive3、多网卡服务器4、收流端口配置5、端口区间可以如何配置6、搭建GB28181视频直播平台 1、流媒体服务配置 LiveGBS中基础配置-》流…

多线程---创建线程

1.概述 多线程是指从软件或者硬件上实现多个线程并发执行的技术。线程是程序中独立运行的程序片段&#xff0c;每个线程都有独立的执行流程&#xff0c;可以在同一时间内执行不同的任务。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程&#xff0c;进而提…

反编译调试C#编写的exe软件和dll方法详解

1.首先需要下载软件dnSpy.exe&#xff0c;下载地址&#xff1a;https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8 2.使用方法&#xff1a; 首先打开项目&#xff0c;我们这里可以选择dll&#xff0c;也可以选择exe 这边我们是打开了一个WPF写的客户端软件。 2.打开后我…

不同品牌和种类的电容与电感实测对比(D值、Q值、ESR、X)

最近买了个LCR电桥&#xff0c;就想测一下手头上的各种电容电感的参数&#xff0c;对比一下。 测试设备是中创ET4410&#xff0c;测量的参数有&#xff1a;电容值、电感值、D(损耗角正切值)、Q(品质因数)、ESR(等效串联电阻)、X(电抗&#xff0c;通常表示为感抗XL或容抗XC)。 …

使用 LangChain+大模型,基于文本数据构建知识图谱

大家好&#xff01;在本篇博客中&#xff0c;我将带领大家学习知识图谱以及如何利用大模型和自己的文本数据构建一个。 喜欢本文记得收藏、关注、点赞。 什么是知识图谱&#xff1f; 知识图谱&#xff0c;也被称为语义图&#xff0c;是一种智能结构&#xff0c;以高效的方式…

【打工日常】使用docker部署Dashdot工具箱

一、Dashdot介绍 dashdot是一个简洁清晰的服务器数据仪表板&#xff0c;基于React实现 &#xff0c;主要是显示操作系统、进程、存储、内存、网络这五个的数据。 二、本次实践介绍 1. 本次实践简介 本次实践部署环境为个人测试环境 2. 本地环境规划 本次实践环境规划&#xf…

PyCharm 自动缩进代码 (Auto-Indent Lines)

PyCharm 自动缩进代码 [Auto-Indent Lines] 1. Ctrl A2. Code -> Auto-Indent LinesReferences 1. Ctrl A 全选代码。 2. Code -> Auto-Indent Lines 自动缩进快捷键 Ctrl Alt I。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

使用Apache ECharts同时绘制多个统计图表

目录 1、介绍 2、相关知识 3、代码 4、效果 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Python人工智能开发和前端开发。 …