设计模式---工厂模式

1.什么是设计模式

  • 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

  • 23种设计模式的介绍

  • 设计模式通常描述了一组相互紧密作用的类与对象。

2.什么是类与对象

  • 类:类是一种用户定义的引用数据类型,也称类类型;每个类包含数据说明和一组操作数据或传递消息的函数
  • 对象:类的一种具象,实例化
    在这里插入图片描述
  • C语言仿造类与对象的例子
#include <stdio.h>struct Animal   //用c语言仿照的动物类
{char name[12];int age;        //成员属性char sex;void (*pRun)();    //成员方法void (*pEat)();
};void dogEat()
{printf("狗吃骨头\n");
}void catEat()
{printf("猫吃鱼\n");
}void dogRun()
{printf("狗会追着人跑\n");
}void catRun()
{printf("猫会爬树\n");
}int main()
{struct Animal dog={.pEat=dogEat,.pRun=dogRun,};  //动物类实例化后的对象struct Animal cat={.pEat=catEat,.pRun=catRun,};/* dog.pEat=dogEat;//为具体对象赋予行为方法dog.pRun=dogRun;cat.pEat=catEat;cat.pRun=catRun;*/dog.pEat();//调用具体对象的行为方法dog.pRun();cat.pEat();cat.pRun();return 0;
}

3.什么是工厂模式

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

用C语言采用工厂模式思想设计的例子
animal.h

#include <stdio.h>struct Animal   
{char name[12];int age;        char sex;void (*pRun)();    void (*pEat)();struct Animal* next;};struct Animal* putDogInLink(struct Animal* phead);
struct Animal* putCatInLink(struct Animal *phead);

cat.c

#include "animal.h"void catEat()
{printf("猫会吃鱼\n");
}void catRun()
{printf("猫喜欢爬树\n");
}struct Animal cat={//实例化对象猫.name="Tom",.pEat=catEat,.pRun=catRun,};struct Animal* putCatInLink(struct Animal *phead)//将猫对象插入链表的方法
{if(phead == NULL){phead=&cat;return phead;}else{cat.next=phead;phead=&cat;return phead;}}

dog.c

#include "animal.h"void dogEat()
{printf("狗爱吃骨头\n");
}void dogRun()
{printf("狗会追着人跑\n");
}struct Animal dog={//实例化对象狗.name="dahuang",.pEat=dogEat,.pRun=dogRun,};  struct Animal* putDogInLink(struct Animal* phead)//将狗对象拆入链表的方法
{if(phead == NULL){phead=&dog;return phead;}else{dog.next=phead;phead=&dog;return phead;}
}

测试用的例子
mainPro.c

#include "animal.h"
#include <string.h>struct Animal* findUnitByName(char *name,struct Animal *phead)//查找链表
{struct Animal *tmp=phead;if(tmp==NULL){printf("链表为空\n");return NULL;}else{while(tmp !=NULL){if(strcmp(tmp->name,name) == 0){return tmp;}tmp=tmp->next;}return NULL;}}int main()
{char buf[128]={0};struct Animal *phead = NULL;struct Animal *ptmp  = NULL;phead = putCatInLink(phead);phead = putDogInLink(phead);while (1){printf("请输入想要查找的动物名字:Tom/dahuang\n");scanf("%s",buf);puts(buf);ptmp=findUnitByName(buf,phead);if(ptmp != NULL){printf("%s\n",ptmp->name);ptmp->pEat();ptmp->pRun();}memset(buf,0,sizeof(buf));}return 0;
}

设计思想图
在这里插入图片描述

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

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

相关文章

2023全新UI好看的社区源码下载/反编译版

2023全新UI好看的社区源码下载/反编译版 这次分享一个RuleAPP二开美化版&#xff08;尊重每个作者版权&#xff09;&#xff0c;无加密可反编译版本放压缩包了&#xff0c;自己弄吧&#xff01;&#xff01;&#xff01; RuleAPP本身就是一款免费开源强大的社区&#xff0c;基…

周末在家值班,解决几个月前遗忘的Bug

问题&#xff1a; 周末被迫在家值班&#xff0c;无聊之际打开尘封已久的Bug清单&#xff0c;发现有Bug拖了几个月还没解决… 场景是这样子的&#xff0c;有个功能是拿Redis缓存热点数据进行展示&#xff0c;暂且称它为功能A&#xff0c;有个另外的功能B&#xff0c;它会去更新缓…

黑马头条项目学习--Day2: app端文章查看,静态化freemarker,分布式文件系统minIO

app端文章 Day02: app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIOa. app端文章列表查询1) 需求分析2) 实现思路 b. app端文章详细1) 需求分析2) Freemarker概述a) 基础语法种类b) 集合指令&#xff08;List和Map&#xff09;c) if指令d) 运算符e) 空值处理f) …

使用最新技术实现智能考试系统源码

智能考试系统是一种重要的教育技术应用&#xff0c;它能够通过结合计算机科学和教育理论&#xff0c;为教育工作者提供一个高效、灵活和可靠的考试平台。最近&#xff0c;随着人工智能和大数据技术的飞速发展&#xff0c;智能考试系统受到了越来越多的关注。本文将详细介绍如何…

【Python】单元测试框架unitest及其高级应用

目录 Unittest 简单使用示例 重要概念 断言方法 深入 高级应用 认识Page Object 资料获取方法 Unittest Unittest是python的一个单元测试框架&#xff0c;但是它不仅适用于单元测试&#xff0c;还适用自动化测试用例的开发与执行。我们可以很方便的使用它组织执行测试用…

基于arcFace+faiss开发构建人脸识别系统

在上一篇博文《基于facenetfaiss开发构建人脸识别系统》中&#xff0c;我们实践了基于facenet和faiss的人脸识别系统开发&#xff0c;基于facenet后续提出来很多新的改进的网络模型&#xff0c;arcFace就是其中一款优秀的网络模型&#xff0c;本文的整体开发实现流程与前文相同…

04-2_Qt 5.9 C++开发指南_SpinBox使用

文章目录 1. SpinBox简介2. SpinBox使用2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. SpinBox简介 QSpinBox 用于整数的显示和输入&#xff0c;一般显示十进制数&#xff0c;也可以显示二进制、十六进制的数&#xff0c;而且可以在显示框中增加前缀或后缀。 QDoubleSpinBox…

(MVC)SpringBoot+Mybatis+Mapper.xml

前言&#xff1a;本篇博客主要对MVC架构、Mybatis工程加深下理解&#xff0c;前面写过一篇博客&#xff1a;SprintBoothtml/css/jsmybatis的demo&#xff0c;里面涉及到了Mybatis的应用&#xff0c;此篇博客主要介绍一种将sql语句写到了配置文件里的方法&#xff0c;即Mybatis里…

IP路由基础+OSPF 基础

IP路由 RIB与FIB RIB&#xff1a;Routing Information Base&#xff0c;路由信息库 &#xff0c;路由器的控制平面 FIB&#xff1a;Forwarding Information Base&#xff0c;转发信息库&#xff0c;路由器的数据平面 路由信息库主要是记录直连路由以及协议宣告的路由信息&am…

有哪些简单的AI绘画软件?

随着人工智能技术的不断发展&#xff0c;越来越多的人工智能绘画软件出现了。人工智能绘画软件利用人工智能技术&#xff0c;通过计算机自动生成或辅助生成艺术作品。人工智能绘画软件通常集成了深度学习、计算机视觉和自然语言处理技术&#xff0c;可以模拟人类的创作过程&…

Openlayers实战:fill,stroke,icon,text应用范例

Openlayers中加载或者绘制的数据,在layer上以矢量的形式展示,通过设置style,可以赋值填充色,边框大小颜色,文字,图片等。在本示例中,将这些基础的内容汇集在一起,做一个演示。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此…

SolidUI社区-提示词链式思考(CoT)

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…