2、工厂模式的实现

工厂模式概念

工厂模式是一种常用的设计模式,它主要用于实例化对象。这种模式的主要思想是在不暴露具体的实现细节的情况下,让客户端能够创建具有特定接口的对象。它可以让我们在运行时决定实例化哪个类。

在C语言中,实例化对象意味着创建一个新的特定类型的变量或结构体实例。虽然C语言不支持像C++或Java那样的真正的面向对象编程概念,但它确实允许我们使用一些方法来模拟类似的行为,比如通过结构体和函数来模仿类和方法的概念。

通常情况下,我们会定义一个抽象的基类或接口,然后由各个子类继承并实现。接下来,我们可以定义一个工厂类,用于创建这些子类的具体实例。客户端只需要与工厂类交互,而不需要了解具体的产品是如何创建的。

工厂模式的基本步骤

1. 定义一个接口或者抽象类,表示产品的类型。
2. 创建一些实现了这个接口的具体类,每个具体类代表一种具体的产品。
3. 创建一个工厂类,用于创建不同种类的产品实例。
4. 客户端代码只需与工厂类交互即可得到产品实例,无需关心产品的具体实现。

工厂模式主要优点

  • 将对象的创建与对象的使用分离开来,使得用户不必关心对象的创建细节。
  • 提供了一种创建对象的最佳方式,可以方便地替换产品,且不影响客户端的使用。
  • 简化了客户端的使用方式,只需要指定所需的产品类型,就可以得到相应的产品实例。

工厂模式实现示意

 通过链表将编写的各个函数链接在一起,在main函数里面调用他们(基本思想:链表遍历)

工厂模式实现效果

源代码

Animal.h

#include <stdio.h>
struct Animal{
    char name[12];//成员属性
    int age;
    char sex;
    void (*peat)();//成员方法
    void (*pbeat)();
	struct Animal *next;
};
	struct Animal* putCatLink(struct Animal * phead);
	struct Animal* putDogLink(struct Animal * phead);
	struct Animal* putPersonLink(struct Animal * phead);

Cat.c

#include "Animal.h"

void catEat(){
    printf("catEat\n");
}

struct Animal cat={
	.name="TOM",
    .peat=catEat
    };

struct Animal* putCatLink(struct Animal *phead){



	if(phead==NULL){
		return &cat;
		}else{

			cat.next=phead;
			phead=&cat;
			return phead;
		}
}

Dog.c

#include "Animal.h"

void dogEat(){
    printf("dogEat\n");
}

struct Animal dog={
	.name="ah",
    .peat=dogEat
    };

struct Animal* putDogLink(struct Animal *phead){



	if(phead==NULL){
		return &dog;
		}else{

			dog.next=phead;
			phead=&dog;
			return phead;
		}
}

Person.c

#include "Animal.h"

void personEat(){
    printf("personEat\n");
}

struct Animal person={
	.name="sf",
    .peat=personEat
    };

struct Animal* putPersonLink(struct Animal *phead){



	if(phead==NULL){
		return &person;
		}else{

			person.next=phead;
			phead=&person;
			return phead;
		}
}

mainPro.c

#include <stdio.h>
#include <string.h>


#include "Animal.h"

struct Animal* FindUtilByName(char *str,struct Animal *phead){
	if(phead==NULL){
		return NULL;
	}else{

		while(1){
			if(strcmp(phead->name,str)==0){
				return phead;
				}
			phead=phead->next;
		}
	}
	return NULL;
}


int main(){

	char buf[128]={'\0'};
	struct Animal *ptmp;

	struct Animal *phead=NULL;

	phead=putCatLink(phead);

	phead=putDogLink(phead);

	phead=putPersonLink(phead);
	while(1){
		printf("Please Enter:TOM,ah,sf\n");
		scanf("%s",buf);
		ptmp=FindUtilByName(buf,phead);
		if(ptmp!=NULL){
		ptmp->peat();
		}
		memset(buf,'\0',sizeof(buf));
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用LLM-Tuning实现百川和清华ChatGLM的Lora微调

LLM-Tuning项目源码&#xff1a; GitHub - beyondguo/LLM-Tuning: Tuning LLMs with no tears&#x1f4a6;, sharing LLM-tools with love❤️.Tuning LLMs with no tears&#x1f4a6;, sharing LLM-tools with love❤️. - GitHub - beyondguo/LLM-Tuning: Tuning LLMs wit…

eNSP毕业设计系列-《大型企业网》-BGP网络无nat

客户主要需求&#xff1a;需要有三栋楼&#xff0c;每栋楼有三个业务。 又新增了要求&#xff0c;要双核心、双防火墙。 所以我根据客户的需求&#xff0c;完成了如下组网设计。 主要技术&#xff0c;MSTPVRRP链路聚合OSPF传统纵网&#xff0c;&#xff08;万金油组合&#…

企业计算机中了eking勒索病毒如何解毒,eking勒索病毒文件恢复

网络技术的不断发展&#xff0c;为企业的生产生活提供了极大便利&#xff0c;但随之而来的网络安全威胁也不断增加&#xff0c;近期&#xff0c;很多企业的计算机服务器遭到了eking勒索病毒攻击&#xff0c;导致企业的计算机服务器所有数据被加密&#xff0c;无法正常使用&…

Swagger3 GET请求,使用对象接收 Query 参数,注解怎么写?

简中互联网上就没一个靠谱的答案&#xff0c;最终翻到了 Github Issue 上才解决&#xff0c;真 TMD…… CSDN 就一坨 shit mountain 解决方案 原文&#xff1a;https://github.com/swagger-api/swagger-core/issues/4177 太长不看&#xff1a; 请求方法参数上加 ParameterObj…

RabbitMQ实战

文章目录 1、简介2、MQ优点缺点MQ的应用场景AMQP工作原理市面上常见的MQ 3、Linux安装RabbitMQ3.1 版本对应3.2 安装socat3.3 下载 Erlang/OTP、安装、验证 erlang方法一&#xff1a;1. 下载2. 将下载的Erlang服务上传到服务器上面3. 解压4. 编译erlang的依赖环境5. 安装Erlang…

Pensoul AI大更新!图生图功能日趋完善

Pensoul AI上线刚半个月&#xff0c;程序猿们已经做好了二期更新内容。 让我们一起来看看具体有哪些内容吧~ PensoulAI一期上线内容中&#xff0c;“文生图”功能已经比较完善&#xff0c; PensoulAI二期主要是针对图生图功能进行优化。 首先&#xff0c;新增加了线稿渲染功…

2023亚太杯数学建模C题思路

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

修改django开发环境runserver命令默认的端口

runserver默认8000端口 虽然python manage.py runserver 8080 可以指定端口&#xff0c;但不想每次runserver都添加8080这个参数 可以通过修改manage.py进行修改&#xff0c;只需要加三行&#xff1a; from django.core.management.commands.runserver import Command as Ru…

ESP32 BLE特征值示例

键盘特征值初始化示例 void BleKeyboard::begin(void) {BLEDevice::init(deviceName);BLEServer* pServer BLEDevice::createServer();pServer->setCallbacks(this);hid new BLEHIDDevice(pServer);inputKeyboard hid->inputReport(KEYBOARD_ID); // <-- input R…

Vue基于html2canvas和jspdf生成pdf文件,解决jspdf中文乱码及自动换行等问题

在做项目时有这么一个需求&#xff0c;需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法 解决一些问题&#xff1a; 导出按A4纸大小排列预留页面边距的问题内容过多自动分页的问题直接使用jsp…

Mistral 7B 比Llama 2更好的开源大模型 (一)

Mistral 7B 简介 Mistral 7B Mistral 7B 是一个 7.3B 参数模型: 在所有基准测试中优于 Llama 2 13B在许多基准测试中优于 Llama 1 34B接近 CodeLlama 7B 的代码性能,同时保持擅长英语任务使用分组查询注意力 (GQA) 加快推理速度使用滑动窗口注意力 (SWA) 以更低的成本处…

加一000

题目链接 加一 题目描述 注意点 0 < digits[i] < 9 解答思路 根据数学思想&#xff0c;对最后一位进行加一&#xff0c;任意位置进一会对下一位有影响当digits中所有元素都为9时&#xff0c;整个数字都会加一位&#xff0c;也就是10000…&#xff0c;需要特殊考虑 …

淘宝API接口成为淘宝商家及企业ERP系统不可或缺的重要因素

API全称为Application Programming Interface&#xff0c;中文是应用程序编程接口。它其实是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。 那如果…

30岁之前透支,30岁之后还债。

前言 看到不少私信问我为啥没有更新了&#xff0c;我没有一一回复&#xff0c;实在是身体抱恙&#xff0c;心情沉重&#xff0c;加上应付于工作&#xff0c;周旋于家庭&#xff0c;自然挤压了自我空间。 今天思来想去&#xff0c;重新执键&#xff0c;决定久违地又一次写点分…

低代码、零代码开源与不开源:区别解析

在如今日益发展的数字时代&#xff0c;程序开发变得越来越重要。为了实现日益提高的业务需求&#xff0c;开发人员必须能够以更高效、更灵活的方式构建和交货软件解决方案。低代码和零代码开源是近几年流行的两种开发方法。本文将探讨它们与传统非开源程序开发的差别&#xff0…

NSSCTF web刷题记录5

文章目录 [HZNUCTF 2023 preliminary]ezlogin[MoeCTF 2021]地狱通讯[NSSRound#7 Team]0o0[ISITDTU 2019]EasyPHP[极客大挑战 2020]greatphp[安洵杯 2020]Validator [HZNUCTF 2023 preliminary]ezlogin 考点&#xff1a;时间盲注 打开题目&#xff0c;在源码出得到hint 注入点很…

【陈老板赠书活动 - 18期】- 计算机考研精炼1000题

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f468;‍&am…

微服务 Spring Cloud 6,用了这么多年Docker容器,殊不知你还有这么多弯弯绕

目录 一、神之容器 Docker二、Docker架构图1、Docker Client 客户端2、Docker Daemon 守护进程3、镜像&#xff08;Image&#xff09;4、Docker Driver 驱动模块5、Docker Graph内部数据库6、Docker Libcontainer函数库7、Docker Container 容器实例 三、Docker安装1、卸载Dock…

双绞线认证测试方法?四种模型

第一种&#xff0c;永久链路测试模块&#xff0c;Permanent Link Certfication 。其标准严格于常用的通道测试模式。 第二种&#xff0c;跳线模块测试&#xff0c;Pathcord Certification.单体测试。 第三种&#xff0c;通道认证&#xff0c;CHANNEL CERTIFICATION. 第四种&am…

【LeetCode:307. 区域和检索 - 数组可修改 | 树状数组 or 线段树】

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