设计模式(简单工厂模式)

news/2025/1/8 20:37:58/

设计模式(简单工厂模式)

1.什么是设计模式

从建筑设计领域引入到计算机科学中

设计模式一共有23种

代码设计经验的总结,稳定,拓展性更强。一系列编程思想

作用:代码更容易被他人理解、保证代码可靠性、程序的重用性。

详细介绍:[https://www.runoob.com/design-pattern/design-pattern-tutorial.html]:

学习简单工厂模式的目的:为了代码不那么混乱。让代码更稳定,添加功能更方便

算法:致力于解决问题而非设计问题。

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

很多人说,c是一门面向过程的语言,java是一门面向对象的语言;其实这种说法不太对,因为面向过程与面向对象只是一种代码编辑的思想。c也可以面向对象。

2.类和对象

  • 类是一种用户自定义的数据类型,也称为类类型。

  • (C语言中用户自定义的数据类型是结构体。)

  • 对象:类的具象

例子说明:

struct Animal
{int age;int sex;   //成员属性void (*peat)();void (*pbeat)(); //成员方法(一些具体的行为:比如某某人做了某某事)
};struct Animal dog;
struct Animal cat;
struct Animal person; //对上述一种类的具象(即:对象)

一个简单的面向对象例子

OOP1.c

#include<stdio.h>//类:抽象
struct Animal
{char name[32];int  age;int  sex;void (*peat)();void (*pbeat)();
};void dogEat()
{printf("狗吃屎\n");
}void catEat()
{printf("猫吃鱼\n");
}void personEat()
{printf("人吃米\n");
}void dogBeat()
{printf("咬你\n");
}void catBeat()
{printf("抠你\n");
}void personBeat()
{printf("打你\n");
}int main()
{struct Animal cat;   //对象:事物的具象struct Animal dog;struct Animal person;dog.peat=dogEat;  //对象具体的行为cat.peat=catEat;person.peat=personEat;dog.pbeat=dogBeat;cat.pbeat=catBeat;person.pbeat=personBeat;dogEat();catEat();personEat();dogBeat();catBeat();personBeat();return 0; 
}

总结:

类是用户自定义的数据类型。在C语言中是结构体。
类是抽象的,对象能把事物具象化
成员方法是对象的具体行为。做到了事务的具象,每一个对象都有具体的行为

在这里回顾一下函数指针的知识:

每一个函数都有一个入口地址,函数指针是函数的入口地址,而函数名就是函数的地址。
所以把函数指针指向函数名就指向了这个函数。这里说的有点不好,即:声明了这个函数,然后直接调用。

在回顾一下回调函数

定义:
使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。

函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。

简单来说,当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。

示例:

回调函数主要结构有三部分组成:主函数、调用函数和被调函数。C语言中,被调函数通常以函数指针(指向对应函数的入口地址)的形式出现。

//定义回调函数
void PrintfText() 
{printf("Hello World!\n");
}//定义实现回调函数的"调用函数"
// 参数为函数指针,无参数返回void
void CallPrintfText(void (*callfuct)())
{callfuct();
}//实现函数回调
int main(int argc,char* argv[])
{CallPrintfText(PrintfText);return 0;
}

2.2C结构体新玩法

2.2.1常用的方法

struct Animal
{char name[32];int age;int sex;int others;void (*peat)();void (*pbeat)();
};void dogEat()
{printf("狗吃屎\n");
}void catEat()
{printf("猫吃鱼\n");
}void personEat()
{printf("人吃米\n");
}void dogBeat()
{printf("咬你\n");
}void catBeat()
{printf("抠你\n");
}void personBeat()
{printf("打你\n");
}int main()
{struct Animal cat={"阿黄",18,‘b’,100,dogeat,dogBeat};return 0;
}

2.2.2新玩法(内核常用)

struct Animal
{char name[32];int age;int sex;int others;void (*peat)();void (*pbeat)();
};void dogEat()
{printf("狗吃屎\n");
}void catEat()
{printf("猫吃鱼\n");
}void personEat()
{printf("人吃米\n");
}void dogBeat()
{printf("咬你\n");
}void catBeat()
{printf("抠你\n");
}void personBeat()
{printf("打你\n");
}int main()
{struct Animal cat={.peat=catEat;.pbeat=catBeat};struct Animal dog={.peat=dogEat;.pbeat=dogBeat};struct Animal person={.peat=personEat;.pbeat=personBeat};return 0;
}

3.工厂模式

3.1.什么是工厂模式

工厂模式是最常用的设计模式之一。这种类型的设计模式属于创建型模式,他提供了一种创建对象的最佳方式。

在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且时通过使用一个共同的接口来指向新创建的对象

暴露创建逻辑是:暴露了对象的具体指向和 函数的实现方式。

不在业务中暴露,不在文件中暴露,在其他地方做好,调用。

共同的接口:做好API放到工厂里面,然后mian函数里调用

示例:

dog.c

#include "animal.h"void dogEat()
{printf("狗吃屎\n");
}void dogBeat()
{printf("咬你\n");
}struct Animal dog={.name="huang", .peat=dogEat,.pbeat=dogBeat
};struct Animal* putDogInLink(struct Animal *phead)
{if(phead==NULL){return &dog;}else{dog.next=phead;phead=&dog;return phead;}  
}

cat.c

#include "animal.h"void catEat()
{printf("猫吃鱼\n");
}void catBeat()
{printf("抠你\n");
}struct Animal cat={.name="Tom", .peat=catEat,.pbeat=catBeat
};struct Animal* putCatInLink(struct Animal *phead)
{if(phead==NULL){return &cat;}else{cat.next=phead;phead=&cat;return phead;}  
}

fish.c

#include "animal.h"void fishEat()
{printf("鱼吃料\n");
}void fishBeat()
{printf("瞪你\n");
}struct Animal fish={.name="fish", .peat=fishEat,.pbeat=fishBeat
};struct Animal* putFishInLink(struct Animal *phead)
{if(phead==NULL){return &fish;}else{fish.next=phead;phead=&fish;return phead;}  
}

ma.c

#include "animal.h"void maEat()
{printf("马吃草\n");
}void maBeat()
{printf("踢你\n");
}struct Animal ma={.name="ma", .peat=maEat,.pbeat=maBeat
};struct Animal* putMaInLink(struct Animal *phead)
{if(phead==NULL){return &ma;}else{ma.next=phead;phead=&ma;return phead;}  
}

person.c

#include "animal.h"void personEat()
{printf("人吃米\n");
}void personBeat()
{printf("打你\n");
}struct Animal person={.name="xiaoming", .peat=personEat,.pbeat=personBeat
};struct Animal* putPersonInLink(struct Animal *phead)
{if(phead==NULL){return &person;}else{person.next=phead;phead=&person;return phead;}  
}

mianPro.c

#include "animal.h"struct Animal* findUtilName(char *str,struct Animal *phead)
{struct Animal *ptmp=phead;if(phead==NULL){printf("链表为空,无法查找\n");return NULL;}while(ptmp!=NULL){    // printf("哥,你输的指令是正确的\n");if(strcmp(ptmp->name,str)==0){return ptmp; }ptmp=ptmp->next;         }printf("你输错了,大哥,指令不对\n");return NULL;
}int main()
{char buf[128]={0};struct Animal *phead=NULL;struct Animal *ptmp=NULL;phead=putCatInLink(phead);phead=putDogInLink(phead);phead=putPersonInLink(phead);phead=putMaInLink(phead);phead=putFishInLink(phead);while(1){ memset(buf,0,sizeof(buf));printf("please input Tom,huang,xiaoming,ma,fish;quit exit\n");scanf("%s",buf);ptmp=findUtilName(buf,phead);if(ptmp!=NULL){ptmp->peat();ptmp->pbeat();}if(strcmp(buf,"quit")==0){printf("你已退出\n");exit(-1); }}return 0;
}

animal.h

#include<stdlib.h>
#include<stdio.h>
#include<string.h>struct Animal
{char name[32];int age;int sex;int others;void (*peat)();void (*pbeat)();struct Animal *next;
};struct Animal* putCatInLink(struct Animal *phead);
struct Animal* putDogInLink(struct Animal *phead);
struct Animal* putPersonInLink(struct Animal *phead);
struct Animal* putMaInLink(struct Animal *phead);
struct Animal* putFishInLink(struct Animal *phead);

工厂里有猫狗鱼人马,用链表串起来,业务逻辑放在mianpro.c,animal.h暴露出来,然后mianpro调用,这样代码会很稳定,也不乱,一个功能放一个文件


http://www.ppmy.cn/news/790363.html

相关文章

详解C盘Windows文件夹

详解C盘Windows文件夹里重要文件的作用 在整个Windows操作系统中&#xff0c;最重要的莫过于“Windows”文件夹&#xff0c;对电脑进行任何操作几乎都有关。了解这里对于掌握整个系统的运作有很大的作用&#xff0c;如果有兴趣不妨往下看看。 一、印象中的Windows文件夹 “W…

WIN10极限清理 C盘空间

WIN10新安装占用18G 1.新安装的软件最好不装C盘 比如卫士 max ae cad ps 可以节省15G 2.把C:\Windows\System32\DriverStore\FileRepository下的目录&#xff0c;除了日期最新的一批&#xff0c;全删掉 占用1.3G 非必须 3.关闭系统更新 百度 4.金山清理系统垃圾 或者360 不推荐…

桌面麒麟系统添加字体

中标麒麟添加字体办法如下&#xff1a; 1.从互联网上搜索需要的字体&#xff0c;格式后缀最好是.ttf格式的,或者从Windows系统c:\windows\Fonts 整个Fonts文件夹打包拷贝到/root/路径下。 2.最好刻录到光盘导入到中标麒麟系统内&#xff08;搭建本地FTP传输也行&#xff09;。…

C盘的root文件在哪里,root密码存放在哪个文件夹

C盘里有个文件夹叫root是什么&#xff1f;能删除吗 ; 打开我的电脑&#xff0c;点开界面最上面的菜单栏里的工具——文件夹选项——查看——往下拖里面有一项是隐藏已知文件的扩展名&#xff0c;把前面的勾去掉。如果是病毒的话你就会发现这个文件夹其实是个.exe的应用程序&…

清理C盘非必要文件(从认识到C盘空间管理)

计算机C盘文件管理 认识C盘C盘在计算机中发挥的作用C盘文件结构 合理清除C盘文件&#xff0c;释放占用内存1:磁盘清理2:关闭休眠功能&#xff08;可能会扩大很多空间&#xff09;**3&#xff1a;开启电脑存储感知4&#xff1a;设置新内容保存的位置&#xff08;系统更新下载的保…

麒麟桌面系统添加字体

麒麟桌面系统添加字体 1. 获取字体文件 获取 Windows 系统的字体文件。 Windows 系统的字体文件保存目录&#xff1a;C:\Windows\Fonts\&#xff0c;将 Fonts 整个文件夹拷贝至 U 盘&#xff0c;然后复制到麒麟系统桌面上。 上网下载字体文件&#xff0c;字体文件通用&…

C盘下各个文件夹简介

├—WINDOWS │ ├—system32&#xff08;存放Windows的系统文件和硬件驱动程序&#xff09; │ │ ├—config&#xff08;用户配置信息和密码信息&#xff09; │ │ │ └—systemprofile&#xff08;系统配置信息&#xff0c;用于恢复系统&#xff09; │ │ ├—drivers&a…

方舟服务器 mod文件夹,方舟mod文件夹应该放在哪 | 手游网游页游攻略大全

发布时间:2016-05-14 模拟人生3" data_ue_src="http://www.douxie.com/game/4710.html" textvalue="模拟人生3" style=&qu ... 标签: 游戏攻略 游戏秘籍 模拟人生3 发布时间:2016-04-01 Mod文件正确安装方法步骤如下-- 正版:把Mod文件夹放置到…