设计模式---工厂模式

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

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

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

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

相关文章

Leetcode-每日一题【剑指 Offer 18. 删除链表的节点】

题目 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。 返回删除后的链表的头节点。 注意&#xff1a;此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点&#xff0c;那么在调…

Vue2:组件高级(下)

Vue2&#xff1a;组件高级&#xff08;下&#xff09; Date: May 25, 2023 Sum: 自定义指令、插槽、商品列表、动态组件 目标&#xff1a; 自定义指令 基础概念&#xff1a; 概念&#xff1a; 内置指令&#xff1a;vue 官方提供了 v-for、v-model、v-if 等常用的内置指令。…

Python练习 linux系统资源监控

yum install python3 yum -y install python3-pip yum -y install epel-release yum -y install gcc python-devel pip install --trusted-host pypi.tuna.tsinghua.edu.cn psutil 初版&#xff1a; import os import sys import time import platform import subprocess …

day10 快速排序 方法重载 和 方法递推

方法重载 斐波拉契数列问题 使用重载思想解决 public static int method(int n){if (n 2 ){return 1 ;}return (n-1)*2method(n-1);}public static int f(int n){if (n 1){return 1;}if (n 2){return 2;}return f(n-1)f(n-2);} 快速排序 思维很简单&#xff0c;类似二…

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容&#xff0c;信息以逗号分隔生成的&#xff0c;现需求要根据此字段数据在其它表查询相关的内容展现出来&#xff0c;第一想法是切割数据&#xff0c;以逗号作为切割符&#xff0c;以下为总结的实现方法&#xff0c;以供大家参…

python制作小程序制作流程,用python编写一个小程序

这篇文章主要介绍了python制作小程序代码宠物运输&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 d…

第二季“数字强市建设体验团”活动感悟-张继群

目录 第二季“数字强市建设体验团”活动感悟-张继群 第二季“数字强市建设体验团”活动感悟-张继群 此次参观中山东安信木业、费县智慧城市运营中心、澳柯玛以及沂南双创科技园区给我留下深刻印象&#xff0c;我深深地感受到了现代科技与生活的紧密联系。我们临沂市智慧大数据…

在x86下运行的Ubuntu系统上部署QEMU用于模拟RISC-V硬件系统

1.配置工作环境 sudo apt install gcc bison flex libncurses-dev ninja-build \pkg-config build-essential zlib1g-dev pkg-config libglib2.0-dev \binutils-dev libboost-all-dev autoconf libtool libssl-dev \libpixman-1-dev python-capstone virtualenv software-prop…

selenium获取b站视频标题

一、下载selenium 1. 下载对应版本的浏览器驱动 2. 安装selenium 3.把浏览器驱动放到使用的python内核的script目录中 二、测试效果模拟登录b站 from selenium import webdriver from selenium.webdriver.common.by import By import timebrowser webdriver.Chrome() # 打…

设计模式之Bridge模式的C++实现

目录 1、Bridge模式的提出 2、Bridge模式的定义 3、Bridge模式总结 4、需求描述 5、多继承方式实现 6、使用Bridge设计模式实现 1、Bridge模式的提出 在软件功能模块设计中&#xff0c;如果类的实现功能划分不清晰&#xff0c;使得继承得到的子类往往是随着需求的变化&am…

Win10语言设置 - 显示语言和应用语言

前言 Win10的语言设置可以设置显示语言和应用语言。其中&#xff0c;显示语言用于显示系统文字&#xff1b;应用语言用于应用程序显示文字。下文介绍如何设置。 显示语言 打开系统设置&#xff0c;选择时间和语言&#xff0c;如下图&#xff1a; 修改Windows显示语言即可更…

搭建Django+pyhon+vue自动化测试平台

Django安装 使用管理员身份运行pycharm使用local 1 pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple 检查django是否安装成功 1 python -m django --version 创建项目 1 1 django-admin startproject test cd 切换至创建的项目中启动django项目…

linux文本三剑客---grep,sed,awk

目录 grep 什么是grep&#xff1f; grep实例演示 命令参数&#xff1a; 案例演示&#xff1a; sed 概念&#xff1a; 常用选项&#xff1a; 案例演示&#xff1a; awk 概念&#xff1a; awk常用命令选项&#xff1a; awk变量&#xff1a; 内置变量 自定义变量 a…

Java课题笔记~ JavaWeb概述/开发基础

JavaWeb概述/开发基础 1.XML基础 &#xff08;1&#xff09;XML概述 &#xff08;2&#xff09;XML语法 &#xff08;3&#xff09;DTD约束 &#xff08;4&#xff09;Schema约束&#xff08;XML Schema 比 DTD 更强大&#xff09; 2.Web基础知识 Web是一个分布式的超媒…

1、如何实现两台电脑之间数据相互读写

一、确保两台电脑在同一个局域网中&#xff0c;可以使用网线【动态配置】进行两台电脑互连。 二、静态配置: 将IP地址和网关设为192.168.0.1&#xff0c;目的是让这台电脑做另一台电脑的网关&#xff0c;子网掩码一点击会自动添加。第二台电脑同样打开设置&#xff0c;此处IP地…

MySQL之深入InnoDB存储引擎——Undo页

文章目录 一、UNDO日志格式1、INSERT操作对应的UNDO日志2、DELETE操作对应的undo日志3、UPDATE操作对应的undo日志1&#xff09;不更新主键2&#xff09;更新主键的操作 3、增删改操作对二级索引的影响 二、UNDO页三、UNDO页面链表四、undo日志具体写入过程五、回滚段1、回滚段…

初中信息技术考试编程题,初中信息技术python教案

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;初中信息技术python编程题库 网盘&#xff0c;初中信息技术python编程教学&#xff0c;今天让我们一起来看看吧&#xff01; ID:12450455 资源大小&#xff1a;934KB 资料简介: 2019-2020学年初中信息技术【轻松备课】P…

阔别三年,领先回归!别克LPGA锦标赛申城十月再启高球盛会

2023年8月4日——2023年金秋十月&#xff0c;阔别中国赛场已久的别克LPGA锦标赛将强势归来&#xff0c;于10月12日至15日在上海旗忠花园高尔夫俱乐部再次拉开帷幕。作为三年来首个回归、同时也是今年国内唯一开赛的国际顶级高尔夫职业赛事&#xff0c;别克LPGA锦标赛将吸引全世…

vscode 设置滑条颜色

1. 默认的滑条是灰黑色的&#xff0c;很难看的清 2. 左下角&#xff0c;打开VS Code 设置功能 3. 输入命令 workbench color&#xff0c;回车 4. 找到工作台&#xff1a;自定义颜色设置&#xff0c;打开设置文件 setting.json 5. 打开配置文件 6. 添加颜色配置 "workben…

谷歌推出AI模型机器人RT2 将文本和图像输出为机器人动作

去年年底&#xff0c;ChatGPT火遍全球&#xff0c;全世界都见识了大语言模型的强大力量。人们对大模型不再陌生&#xff0c;开始使用基于大模型的应用绘画、作图、搜索资料、设计剧情等&#xff0c;而妙用不止于此。谷歌推出了Robotics Transformer 2(RT2)&#xff0c;这是一个…