软件设计模式——工厂模式

软件设计模式——工厂模式

文章目录

  • 软件设计模式——工厂模式
    • 一、设计模式的认知
      • 1.1 什么是软件设计模式:
      • 1.2 为什么要学习设计模式:
      • 1.3 设计模式的分类:
    • 二、工厂模式
      • 2.1 工厂模式实例:

一、设计模式的认知

1.1 什么是软件设计模式:

软件设计模式,又称设计模式。它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。综上:设计模式就是泛指一系列编程的思想,是代码设计经验的总结,基于设计模式来开发代码可以使得程序更加稳定,拓展性更强。

1.2 为什么要学习设计模式:

​ 在以往的项目开发中,不管是 ftp服务器 还是 图像识别智能垃圾桶 又或者更之前的智能小车项目,都没有一个固定的代码开发格式,更多的是根据需求一个个实现功能,虽然有了分文件编程的思想,但是代码整体还是缺乏规整度。尤其是在开发过程中,一个功能的实现经常会导致其他功能出现问题,所以需要学习设计模式,使得代码更加健壮和格式化。

1.3 设计模式的分类:

软件设计模式共有23种,总体来说可以被分为三大类:

  • 五种创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
  • 七种结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 十一种行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

下面我们就来学习创建型模式中的一种:工厂模式

二、工厂模式

  • 工厂模式(Factory Pattern)是程序中最常见的设计模式之一,这种类型的设计模式属于:创建型模式它提供了一种创建对象的最佳方法
  • 在工厂模式中,我们在创建对象时不会对客户端暴露创建的逻辑,并且是通过使用一个共同的接口来指向一个新创建的对象。

2.1 工厂模式实例:

  • .h文件
#ifndef __PEOPLE_H__
#define __PEOPLE_H__#include <stdio.h>struct People {int age;char name[32];          //成员属性void (*ptalk)();        //成员方法struct People *next;    //链表
};struct People* ZhangsanInLink(struct People *head); 
struct People* LisiInLink(struct People *head);#endif
  • People1.c文件
#include "People.h"void Zhangsan_talk()                                        //张三的说话函数
{printf("请多关照,我是张三.\n");
}struct People Zhangsan = {                                  //张三的结构体.age = 25,.name = "Zhangsan",.ptalk = Zhangsan_talk
};  struct People* ZhangsanInLink(struct People *head)          //将张三加入链表
{   if(head == NULL){head = &Zhangsan;}else{Zhangsan.next = head;head = &Zhangsan;}return head;
}
  • People2.c文件
#include "People.h"void Lisi_talk()                                        //Lisi的说话函数
{printf("请多关照,我是李四.\n");   
}struct People Lisi = {                                  //李四的结构体.age = 20,.name = "Lisi",.ptalk = Lisi_talk
};   struct People* LisiInLink(struct People *head)          //将Lisi加入链表
{struct People *p = head;if(p == NULL){head = &Lisi;}else{Lisi.next = head;head = &Lisi;}return head;
}
  • main.c文件
#include "People.h"
#include <string.h>struct People* FindPeople(struct People *phead, char *name)                         // 链表查找函数
{struct People *p = phead;while(p != NULL){                                                               // 遍历链表if(strcmp(p->name, name) == 0){                                             // 找到该人return p;                                                               // 返回该人指针}p = p->next;}return NULL;                                                                     // 没找到该人
}int main()
{char name[32] = {'\0'};                                 // 姓名struct People *phead = NULL;                            // 链表头指针struct People *pfind  = NULL;                           // 链表查找指针// 在链表中插入张三节点和李四节点phead = ZhangsanInLink(phead); phead = LisiInLink(phead);if(phead == NULL){printf("链表中没有元素.\n");return 1;}while(1){printf("请输入要查找的姓名:张三、李四(English)\n");                               // 循环读取姓名scanf("%s",name);                                                               // 输入姓名 if(strcmp(name, "Zhangsan") == 0 || strcmp(name, "Lisi") == 0){                 // 找到该人pfind = FindPeople(phead, name);                                            // 查找该人if(pfind == NULL){printf("没有找到该人.\n");}else{                                                                      // 找到该人printf("姓名:%s, 年龄:%d\n",pfind->name, pfind->age);                    // 打印该人信息pfind->ptalk();                                                         // 调用该人的方法}}else{                                                                          // 输入错误printf("请输入正确的姓名.\n");}memset(name, '\0', sizeof(name));                                               // 清空姓名}return 0;
}

在这里插入图片描述

从上面的案例可以看出:

  • 这就是一个典型的工厂模式代码设计。对于main.c,相比于整体其代码量并不多,且不会向用户暴露创建逻辑。
  • 结构体People就是一个工厂是一个类People1People2作为对象以链表的形式存在在工厂中
    main函数需要做的就是将工厂中的模块组装起来,然后想用哪个就去找到哪个就可以。
    从上面的代码结构不难看出,使用工厂模式使得代码更稳定且拓展性更强,如果需要一个新的模块,只需要再创建一个如People3,并将其插入结构体People中就可以,十分的方便且不会影响到其他的模块

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

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

相关文章

WordPress LearnPress插件 SQL注入复现(CVE-2024-8522)

0x01 产品描述&#xff1a; LearnPress 是一款功能强大的 WordPress LMS&#xff08;学习管理系统&#xff09;插件&#xff0c;适用于创建和销售在线课程。凭借其直观的界面和丰富的功能&#xff0c;无论您是否具备编程背景&#xff0c;都能轻松搭建起在线教育网站。学会如何使…

Java之路--瓦解逻辑控制与方法使用已是瓮中捉鳖

嗨嗨大家&#xff01;今天我们来学习逻辑运算和方法的使用~ 目录 一 逻辑控制 1 分支结构 1.1 if语句 1.2 switch 语句 2 循环结构 2.1 while 循环 2.2 for 循环 2.3 do while 循环 2.4 break 2.5 continue 3. 输出输入 二、方法的使用 1 方法定义语法 2 实参和…

网络通信——DHCP

目录 一.DHCP应用场景 二.通信过程 三.DHCP报文 四.DHCP通信原理 &#xff08;1&#xff09;租借过程 &#xff08;2&#xff09;DHCP 租期更新 &#xff08;3&#xff09;DHCP重绑定 五.一般路由器的DHCP支持两种地址池 &#xff08;1&#xff09;接口地址池 &…

进制转换,原码反码补码

正数的三码合一 1个byte8位&#xff0c;-128符号位溢出了&#xff0c;所以是1000 0000

基于Python大数据的B站热门视频的数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

全连接神经网络

这里写目录标题 全连接神经网络vs前馈神经网络基于全连接神经网络的手写数字识别使用Pytorch实现纯Python实现 全连接神经网络的局限 端到端学习 深度学习有时也称为端到端机器学习&#xff08;end-to-end machine learning&#xff09;。这里所说的端到端是指从一端到另一端的…

David律所代理Jose Martin幽默水果版权首发维权,尚未TRO

案件基本情况&#xff1a;起诉时间&#xff1a;2024/9/18案件号&#xff1a;2024-cv-08484原告&#xff1a;Jose Martin原告律所&#xff1a;David起诉地&#xff1a;伊利诺伊州北部法院涉案商标/版权&#xff1a;原告品牌简介&#xff1a;西班牙的卓越艺术家Jose Martin以他非…

网络原理之IP协议(网络层)

目录 前言 什么是IP协议&#xff1f; IP协议的协议头格式 16位总长度&#xff08;字节数&#xff09; 16位标识、3位标志位和13位片偏移 8位生存时间 IP地址管理 1.动态分配IP 2.NAT机制&#xff08;网络地址转换&#xff09; NAT机制是如何工作的 NAT机制的优缺点…

Nginx反向代理配置支持websocket

一、官方文档 WebSocket proxying 为了将客户端和服务器之间的连接从HTTP/1.1转换为WebSocket&#xff0c;使用了HTTP/1.1中可用的协议切换机制&#xff08;RFC 2616: Hypertext Transfer Protocol – HTTP/1.1&#xff09;。 然而&#xff0c;这里有一个微妙之处:由于“升级”…

论文阅读:A Generalization of Transformer Networks to Graphs

论文阅读&#xff1a;A Generalization of Transformer Networks to Graphs 论文地址1 摘要2 贡献Graph TransformerOn Graph Sparsity&#xff08;图稀疏&#xff09;On Positional Encodings&#xff08;位置编码&#xff09;3 Graph Transformer Architecture&#xff08;架…

C++:日期类的实现

目录 一、前言 二、头文件 三、各个函数的实现 打印、检查日期及获取日期 、、-、-、 、<、<、>、>、 &#xff01; 日期-日期 >>、<< 一、前言 前面几篇讲了关于类和对象的一些知识&#xff0c;本篇就来实现一下前面用到的日期类。 二、头文…

市面第一款 C++ 版本的U盘装机软件(即将上线)

市面大部分U盘装机软件&#xff0c;都是采用Au3脚本开发&#xff0c;而且有各种捆绑&#xff0c;闲来无聊&#xff0c;采用Qt C制作一款CU盘装机软件&#xff0c;从此告别Au3脚本&#xff0c;各种炫酷界面随便换&#xff0c;敬请期待 另外两个界面暂时不公布&#xff0c;防止Au…

uni-app页面调用接口和路由(四)

文章目录 一、路由二、页面调用接口二、路由跳转1.uni.navigateTo(OBJECT)2.uni.redirectTo(OBJECT)3.uni.reLaunch(OBJECT)4.uni.switchTab(OBJECT)5.uni.navigateBack(OBJECT) 总结 一、路由 路由配置 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配…

Linux —— Socket编程(一)

一、本篇重点 1. 认识IP地址、端口号、网络字节序等网络编程中的基本概念 2. 学习Socket api的基本用法 3. 能够实现一个简单的udp客户端/服务器 二、基本概念 1. 理解源IP地址和目的IP地址 简单的理解&#xff0c;IP地址是用于标识一台机器的&#xff0c;我们通过IP地址去…

Springboot常见问题(bean找不到)

如图错误显示userMapper bean没有找到。 解决方案&#xff1a; mapper包位置有问题&#xff1a;因为SpringBoot默认的包扫描机制会扫描启动类所在的包同级文件和子包下的文件。注解问题&#xff1a; 比如没有加mapper注解 然而无论是UserMapper所在的包位置还是Mapper注解都是…

大数据Hologres(一):Hologres 简单介绍

文章目录 Hologres 简单介绍 一、什么是实时数仓 Hologres 二、产品优势 1、专注实时场景 2、亚秒级交互式分析 3、统一数据服务出口 4、开放生态 5、MaxCompute查询加速 6、计算存储分离架构 三、应用场景 搭建实时数仓 四、产品架构 1、Shared Disk/Storage &am…

ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计

起因&#xff0c; 目的: 客户需求, 就是要设计一个数据库。 过程&#xff0c; 关于工具: UI 设计&#xff0c;我最喜欢的工具其实是 Canva, 但是 Canva 没有合适的模板。我用的是 draw.io, 使用感受是&#xff0c;很垃圾。 各种快捷键不适应&#xff0c;箭头就是点不住&…

OpenCV4.8 开发实战系列专栏之 01- 环境搭建与图像读写

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点&#xff1a; 开发环境搭建、读取图像与显示图像,读取图像…

【笔记篇】一篇文章搞定Spring框架

文章目录 前言一、Spring框架的优势 二、 Spring的使用流程Spring的依赖注入bean后处理器容器后处理器FileSystemResource类Spring的AOP机制AOP基础知识AOP应用案例Spring的事务管理事务控制参数事务的隔离级别 总结 前言 学习完了Spring框架&#xff0c;总结回顾一下。 一、…

使用vite+react+ts+Ant Design开发后台管理项目(三)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术…