C语言设计模式:实现简单工厂模式和工程创建
创始人
2024-05-29 23:22:04
0

目录

一,设计模式概念引入

① 什么是设计模式

② 什么是类和对象

③ 什么是工厂模式

二,C语言工厂模式的实现

① 普通类和对象的代码实现

② 工厂模式代码实现

● cat.c

● dog.c

● person.c

● animal.h

● mainpro.c

● 完善mainpro.c

三,使用Source insight4.0创建工程


一,设计模式概念引入

① 什么是设计模式

设计模式通常被面向对象的软件开发人员所采用,是软件开发人员在软件开发过程中面临问题的解决方案。也是众多软件开发人员经过长时间的试验和错误总结出来的23种设计模式。虽然很多人认为C语言只是面向过程的开发,但鄙人认为此说法并不全面,难道面向对象的语言就不面向过程了吗?同理,在C语言的使用过程中一样允许面向对象。在平时代码编写中,有时会遇到修改一处BUG而影响整个代码的运行,设计模式的出现正好就解决了这一问题。

● 设计模式是建筑设计领域引入到计算机科学中来的;

● 设计模式是对面向对象设计中反复出现的问题的解决方案;

● 算法不是设计模式,因为算法致力于解决问题而非设计问题;

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

● 设计模式使代码更稳定,更安全,拓展性更强,同时也方便代码重构。

② 什么是类和对象

C语言面向过程也可以面向对象,还能用其设计模式,只是不太友好的面向对象
Java面向对象也可以面向过程,只是不太友好的面向过程
面向过程和面向对象只是代码的一种编程方式和编程思想,不应该和编程语言绑定起来

:类是面对对象程序设计实现信息封装的基础。类是一种用户定义的引用数据类型,也称类类型。比如C语言中结构体,就是用户自己定义的一种数据类型

struct Animal{int age;int sex;         //成员属性void (*peat)();  //函数指针void (*pbeat)(); //成员方法
};

对象:类的一种具象。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例就称为对象。

● dog是类Animal的一种具体对象;

● cat是类Animal的一种具体对象;

● person是类Animal的一种具体对象;

struct Animal dog;
struct Animal cat;
struct Animal person;

③ 什么是工厂模式

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

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

● 共同的接口:我们自己创建共同接口API,从工厂里面获得需要的对象放入main函数中去运行。

二,C语言工厂模式的实现

① 普通类和对象的代码实现

#include /*类:struct Animal*/
/*对象:struct Animal dog/cat/person*/struct Animal{char name[128];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 dog = {.peat = dogeat,.pbeat = dogbeat};struct Animal cat = {.peat = cateat,.pbeat = catbeat};struct Animal person = {          .peat = personeat,    //对象,事务的具象.pbeat = personbeat}; dog.peat();cat.peat();person.peat();dog.pbeat();cat.pbeat();person.pbeat();return 0;
}

② 工厂模式代码实现

● 工厂模式不会暴露创建对象的代码逻辑,上面对象代码逻辑全部暴露无遗;

● 以上面的代码为例,以工厂模式的方式将dog,cat,person这几个对象拆分成单独的代码文件,并在每个文件中提供用来链接的函数,方便main函数的调用;

分别创建需要的文件

 

● 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){  //如果头为空,那就返回cat为链表头           return &cat;}else{           cat.next = phead; //否者cat的下一个为链头phead = &cat;     //再把链头指向猫return phead;}
};		

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

● person.c

#include "animal.h"void personeat()
{printf("人吃米\n");
}void personbeat()
{printf("揍\n");
}struct Animal person = {  .name = "xiaomin",.peat = personeat,    //对象,事务的具象.pbeat = personbeat};struct Animal* putPersonInLink(struct Animal *phead)
{if(phead == NULL){return &person;}else{person.next = phead;phead = &person;return phead;}
};		

● animal.h

#include struct Animal{char name[128];int age;int sex;             //成员属性void (*peat)();void (*pbeat)();	 //成员方法struct Animal *next; //涉及到链表,添加链表节点
};struct Animal* putCatInLink(struct Animal *phead); //cat.c文件中的该函数将cat相关全局的结构体加到链表中 
struct Animal* putDogInLink(struct Animal *phead);//dog.c文件中的该函数将dog相关全局的结构体加到链表中
struct Animal* putPersonInLink(struct Animal *phead);//person.c文件中的该函数将person相关全局的结构体加到链表中

● mainpro.c

#include "animal.h"int main()
{struct Animal *phead = NULL;//初始化phead = putCatInLink(phead);phead = putDogInLink(phead);phead = putPersonInLink(phead);return 0;
}

编译说明: 多个.c文件同时编译:gcc *.c , 如果编译过程中没有报错,但是没有输出内容,是因为在manpro.c的代码中没有输出代码,但是链接成功

● 完善mainpro.c

#include "animal.h"
#include struct Animal *findUtilByName(char *str,struct Animal *phead){struct Animal *tmp = phead;if(phead == NULL){printf("空\n");return NULL;}else{while(tmp != NULL){  //遍历链表if(strcmp(tmp->name,str) == 0){ //tmp的值和输入的名字是相等的,说明找到了return tmp;} tmp = tmp->next; //没找到的话就继续遍历链表}return NULL;//一直没找到就返回NULL}
}
int main()
{char buf[128] = {'\0'};struct Animal *phead = NULL;//初始化struct Animal *ptmp;phead = putCatInLink(phead);phead = putDogInLink(phead);phead = putPersonInLink(phead);while(1){printf("请输入:Tom,haung,xiaomin\n");scanf("%s",buf);ptmp = findUtilByName(buf,phead);//根据用户输入的名字,找到相应的结构体if(ptmp != NULL){ptmp->pbeat();ptmp->peat();}memset(buf,'\0',sizeof(buf)); }return 0;
}

编译结果: C语言简单工厂模式完成!

三,使用Source insight4.0创建工程

目的:同时阅读多个文件时更加方便,高效,便于后起维护和管理

打开source insight 

 

 

 

 

相关内容

热门资讯

春天的短句子 关于春天的短句子  无论是在学校还是在社会中,大家都听说过或者使用过一些比较经典的句子吧,根据用途和...
庆祝中秋节的句子 庆祝中秋节的句子(精选125句)  在日复一日的学习、工作或生活中,大家一定没少看到经典的句子吧,不...
面对现实的句子 面对现实的句子  在平平淡淡的学习、工作、生活中,大家一定都接触过一些使用较为普遍的句子吧,句子是能...
思念朋友的句子 思念朋友的句子(精选405句)  在日复一日的学习、工作或生活中,大家都对那些朗朗上口的句子很是熟悉...
浪漫的句子 浪漫的句子15篇  在现实生活或工作学习中,大家一定都接触过一些使用较为普遍的句子吧,句子是由词或词...
春困秋乏的句子 春困秋乏的句子  在日复一日的学习、工作或生活中,大家都接触过比较经典的句子吧,句子是语言运用的基本...
祝自己生日快乐的句子发朋友圈 祝自己生日快乐的句子发朋友圈(精选90句)  句子是语言运用的基本单位,它由词、词组(短语)构成,能...
想念家乡的句子 想念家乡的句子(精选160句)  在学习、工作或生活中,大家都收藏过令自己印象深刻的句子吧,不同的句...
适合九月份发朋友圈的句子 适合九月份发朋友圈的句子  在平凡的学习、工作、生活中,大家都对那些朗朗上口的句子很是熟悉吧,句子的...
感恩父母的暖心简单句子 感恩父母的暖心简单句子(精选280句)  在日复一日的学习、工作或生活中,大家肯定对各类句子都很熟悉...
劝导别人的句子 劝导别人的句子  1) 如果你失去了所有,不要伤心不要难过,因为你还有这个世界!  2) 若能一切随...
孝敬父母的句子 关于孝敬父母的句子(通用170句)  在生活、工作和学习中,大家都知道一些经典的句子吧,句子是能够表...
健身励志的句子 健身励志的句子  在日常学习、工作或生活中,大家都经常接触到句子吧,根据用途和语气,句子可以分为陈述...
清明时节缅怀先烈的句子 清明时节缅怀先烈的句子(精选50句)  在学习、工作乃至生活中,大家最不陌生的就是句子了吧,根据句子...
形容文采很好的句子 形容文采很好的句子1:“踏,踏,踏”,春天的脚步近了,走进地球这大房子。一入眼帘的便是厚厚的白雪。大...
小说爱情段落摘抄简短 小说爱情段落摘抄简短  夏天的雨总是在你最无防备的时候忽然来袭,宛如一场重逢。---辛夷坞《原来你还...
心情低落无奈句子 心情低落无奈句子(精选190句)  在平平淡淡的学习、工作、生活中,许多人都接触过一些比较经典的句子...
描写思念的好句好段 精选描写思念的好句好段大全  思念意思是想念;怀念;指回忆;考虑;思考;思虑;想法。以下是小编收集整...
写亲情的句子 关于写亲情的句子大全  亲情,不论何时,不论何地,她都将永久陪同着你。下面是小编整理的关于写亲情的句...
句子摘抄加赏析   句子摘抄加赏析  1、世上再也没有比时钟更加冷漠的东西了:在您出生的那一刻,在您尽情地摘取青春幻...