2、工厂模式的实现

news2024/11/23 22:37:42

工厂模式概念

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

在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));
	}
}

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

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

相关文章

Leetcode—70.爬楼梯【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—70.爬楼梯 动态规划思想 动态规划算法的本质是使用空间换时间&#xff0c;通过计算和记录状态来得到最优解。 在分析动态规划类题目时&#xff0c;我们可以通过3个问题对题目进行基本的拆解。 1.问题是否分阶段&…

Java编程--定时器/线程池/工厂模式/ ThreadPoolExecutor

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 目录 什么是定时器 实现一个定时器 自己实现一个定时器 什么是线程池 线程池的使用&#xff1a; 什么是工厂模式&#xff1f; 自己实现一个线程池&#xff1a; ThreadPoolExecutor 类…

卓越进行时 | 信息安全测试公益培训班报名!先到先得

为配合推进江苏省网络安全工作的部署实施&#xff0c;培训网络安全技术人才&#xff0c;针对全省网络技术骨干人员&#xff0c;近期&#xff0c;由江苏省网络空间安全学会主办、南京赛宁信息技术有限公司承办的“网络安全技能课堂-信息安全测试培训班”在网络安全卓越中心正式举…

完全免费!超好用的IDEA插件推荐:Apipost-Helper

Idea 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展&#xff0c;可以根据开发人员的需要进行定制和扩展&#xff0c;从而提高开发效率,今天我们就来介绍一款国产的…

ceph的体系结构

文章目录 CephCeph的体系结构对象存储RADOSOSDOSD的状态osd状态检测 数据寻址file--->Object映射Object--->pg映射pg--->osd思考&#xff1a;为什么要在Object和osd之间增加一层pg的映射呢&#xff1f; 存储池monitormonitor与客户端的通信Monitor与osd的通信 数据操作…

7-爬虫-中间件和下载中间件(加代理,加请求头,加cookie)、scrapy集成selenium、源码去重规则(布隆过滤器)、分布式爬虫

0 持久化(pipelines.py)使用步骤 1 爬虫中间件和下载中间件 1.1 爬虫中间件(一般不用) 1.2 下载中间件&#xff08;代理&#xff0c;加请求头&#xff0c;加cookie&#xff09; 1.2.1 加请求头(加到请求对象中) 1.2.2 加cookie 1.2.3 加代理 2 scrapy集成selenium 3 源码去重…

【Transformer从零开始代码实现 pytoch版】(五)总架构类的实现

Transformer总架构 在实现完输入部分、编码器、解码器和输出部分之后&#xff0c;就可以封装各个部件为一个完整的实体类了。 【Transformer从零开始代码实现 pytoch版】&#xff08;一&#xff09;输入部件&#xff1a;embeddingpositionalEncoding 【Transformer从零开始代…

Power Automate-变量和excel表数据的应用

前提表格 Power Automate连接excel请参考&#xff1a;SharePoint-连接Excel-CSDN博客 需求1&#xff1a;计算表格中某列的和 添加操作&#xff0c;搜索变量&#xff0c;选择初始化变量 添加变量的名称、类型和初始值 再新增操作&#xff0c;搜索Excel&#xff0c;点击查看更多…

Kubernetes介绍和环境部署

文章目录 Kubernetes一、Kubernetes介绍1.Kubernetes简介2.Kubernetes概念3.Kubernetes功能4.Kubernetes工作原理5.kubernetes组件6.Kubernetes优缺点 二、Kubernetes环境部署环境基本配置1.所有节点安装docker2.所有节点安装kubeadm、kubelet、kubectl添加yum源containerd配置…

查询数据表格中的数据

1.创建这个表至少20个 1&#xff09;创建数据库&#xff1a;create database 四川信息职业技术; 2&#xff09;创建数据表 3&#xff09;插入数据&#xff08;第一条代码修改了一下手机号码的字段类型&#xff09; 2.统计表中的人数 如果你想根据某个特定的列来统计人数&…

Jenkins在Linux环境下的安装与配置

Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成&#xff08;CI&#xff09;工具&#xff0c;用于解决持续重复的部署、监控工作&#xff1b;它一个开放易用的软件平台&#xff0c;大大简化软件的持续集成。 安装Jenkins 1.使用docker安装 2.本地下载je…

Python数据结构:元组(Tuple)详解

1.介绍和基础操作 Python中的元组&#xff08;Tuple&#xff09;是不可变有序序列&#xff0c;可以容纳任意数据类型&#xff08;包括数字、字符串、布尔型、列表、字典等&#xff09;的元素&#xff0c;通常用圆括号() 包裹。与列表&#xff08;List&#xff09;类似&#xff…

[IJKPLAYER]基于DEMO分析IJKPLAYER(整理版本)

背景 博主主要是从事C语言开发&#xff0c;因此本文着重强调FFMPEG部分&#xff0c;关于JAVA应用和框架层只是一笔带过。IJKPLAYER的实质是对FFMPEG项目中的ffplayer程序进行的二次封装&#xff0c;通过JNI方式完成对外提供JAVA接口。 1.目录结构 activities:包含了demo的所有…

react函数式组件props形式父向子传参

父组件中定义 子组件中触发回调传值 import { useState } from "react"; function Son(params) {const [count, setCount] useState(0);function handleClick() {console.log(params, paramsparamsparamsparamsparamsparams);params.onClick(111)setCount(count 1…

多个微信快速同步发圈

做营销最重要的任务是什么&#xff1f; 毋庸置疑&#xff0c;就是发布朋友圈。 为什么要发圈呢&#xff1f; 现在社交媒体中&#xff0c;微信不管在生活上、工作上都是不可或缺的工具&#xff0c;而朋友圈是微信中社交场景之一&#xff0c;也是很多企业作为推广产品和服务的重…

腾讯云服务器多少钱一年?2023年腾讯云优惠云服务器推荐

作为一名程序员&#xff0c;技术的突飞猛进是从拥有第一台云服务器开始的。那时&#xff0c;我开始尝试使用Linux系统&#xff0c;并成功上线了自己的第一个小程序。自此之后&#xff0c;我和我的同事们都开始拥有自己的云服务器&#xff0c;用来搭建各种小项目或者好玩的东西。…

OpenAtom OpenHarmony三方库创建发布及安全隐私检测

OpenAtom OpenHarmony三方库&#xff08;以下简称“三方库”或“包”&#xff09;&#xff0c;是经过验证可在OpenHarmony系统上可重复使用的软件组件&#xff0c;可帮助开发者快速开发OpenHarmony应用。三方库根据其开发语言分为2种&#xff0c;一种是使用JavaScript和TypeScr…

wpf devexpress设置行和编辑器

如下教程示范如何计算行布局&#xff0c;特定的表格单元编辑器&#xff0c;和格式化显示值。这个教程基于前一个文章 选择行显示 GridControl为所有字段生成行和绑定数据源&#xff0c;如果AutoGenerateColumns 属性选择AddNew。添加行到GridControl精确显示为特别的几行设置。…

Containerd接入Harbor仓库

在使用容器时&#xff0c;避免不了会使用到私有仓库&#xff0c;一般都是采用 harbor 作为私有仓库&#xff0c;docker 对接 harbor 仓库非常简单&#xff0c;哪 containerd 如何对接 harbor 呢&#xff1f; 在内网使用 harbor 根据个人习惯&#xff0c;一般都是非 http 并且是…

【SpringBoot3+Vue3】一【基础篇】

目录 一、Spring Boot概述 1、Spring Boot 特性 1.1 起步依赖 1.2 自动配置 1.3 其他特性 1.3.1 内嵌的Tomcat、Jetty (无需部署WAR文件) 1.3.2 外部化配置 1.3.3 不需要XML配置(properties/yml) 二、Spring Boot入门 1、一个入门程序需求 2、步骤 2.1 创建Maven工…