为啥学设计模式
设计模式有23种,我所会使用的模式为工厂模式,学习设计模式的主要原因是,以前写代码写的很乱,添加工程的时候容易导致程序其它部分的代码被破坏,所以要学习设计模式。
面试回答:
能让代码更加稳定,拓展性更强的一系列软件组织的方法有23种,我使用过工厂模式。
什么是设计模式
设计模式通常描述了一组相互紧密作用的类与对象。
建筑设计领域设计引入到计算机科学中来的。
什么是类和对象
类是一种用户定义的引用数据类型,也称类类型。结构体
对象:类的一种具象
struct Animal{
char name[128];
int age;
int sex; //成员属性
void (*peat)();
void (*pbeat)();//成员方法
};
struct Animal dog;
struct Animal cat;
struct Animal person;
dog、cat、person都是类的一种具体的对象。
#include<stdio.h>
//类:抽象
struct Animal{
char name[128];
int age;
int sex; //成员属性
void (*peat)();
void (*pbeat)();//成员方法
};
void dogEat(){
printf("Dog eat bones\n");
}
void catEat(){
printf("Cat eat fish\n");
}
void personEat(){
printf("human eat rice\n");
}
void personBeat(){
printf("beat\n");
}
void catBeat(){
printf("grasp\n");
}
void dogBeat(){
printf("bite\n");
}
int main(){
struct Animal dog;
struct Animal cat;
struct Animal person;//对象,事物的具象
dog.peat = dogEat;
cat.peat = catEat;
person.peat = personEat;
dog.pbeat = dogBeat;
cat.pbeat = catBeat;
person.pbeat = personBeat;
//函数调用
dog.peat();
cat.peat();
person.peat();
dog.pbeat();
cat.pbeat();
person.pbeat();
return 0;
}
C结构体的新玩法
有时候我们不需要给结构体中的每一项都赋值,只给其中的几项赋值我们可以这么写。
#include<stdio.h>
//类:抽象
struct Animal{
char name[128];
int age;
int sex; //成员属性
void (*peat)();
void (*pbeat)();//成员方法
};
void dogEat(){
printf("Dog eat bones\n");
}
void catEat(){
printf("Cat eat fish\n");
}
void personEat(){
printf("human eat rice\n");
}
void personBeat(){
printf("beat\n");
}
void catBeat(){
printf("grasp\n");
}
void dogBeat(){
printf("bite\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;
}
工厂模式概念的引入
工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
用例:
Animal.h
#include<stdio.h>
#include<string.h>
struct Animal{
char name[128];
int age;
int sex; //成员属性
int others;
void (*peat)();
void (*pbeat)();//成员方法
void (*test)();
struct Animal *next;
};
struct Animal* putCatLink(struct Animal *phead);//函数声明
struct Animal* putDogLink(struct Animal *phead);//函数声明
struct Animal* putPersonLink(struct Animal *phead);//函数声明
struct Animal* findUtilByName(char*buf,struct Animal *phead);
cat.c
#include"Animal.h"
struct Animal cat = {
.name = "Tom",
.peat = catEat,
.pbeat = catBeat
};
struct Animal* putCatLink(struct Animal *phead){//头插法
if(phead == NULL){
phead = &cat;
return phead;//r如果为空链表,把cat当成链表的头
}else{//如果不是空链表,把该链表的cat的下一个指向原头节点,把头节点指向cat,让cat成为新的头节点
cat.next = phead;
phead = &cat;
return phead;
}
}
dog.c
#include"Animal.h"
void dogEat(){
printf("Dog eat bones\n");
}
void dogBeat(){
printf("bite\n");
}
struct Animal dog = {
.name = "huang",
.peat = dogEat,
.pbeat = dogBeat
};
struct Animal* putDogLink(struct Animal * phead){
if(phead == NULL){
phead = &dog;
return phead;
}else{
dog.next = phead;
phead = &dog;
return phead;
}
}
person.c
#include"Animal.h"
void personEat(){
printf("human eat rice\n");
}
void personBeat(){
printf("beat\n");
}
struct Animal person = {
.name = "lin",
.peat = personEat,
.pbeat = personBeat
};
struct Animal* putPersonLink(struct Animal * phead){
if(phead == NULL){
phead= &person;
return phead;
}else{
person.next = phead;
phead = &person;
return phead;
}
}
find.c
#include"Animal.h"
struct Animal* findUtilByName(char * buf,struct Animal *phead){
struct Animal *tmp = phead;
if(phead == NULL){
printf("empty\n");
return NULL;
}else{
while(tmp != NULL){
if(strcmp(buf,tmp->name)==0){
return tmp;
}
tmp = tmp -> next;
}
return NULL;
}
}
mainPro.c
#include"Animal.h"
int main(){
struct Animal* phead = NULL;
struct Animal* ptmp;
char buf[128] = {'\0'};
phead = putCatLink(phead);
phead = putDogLink(phead);
phead = putPersonLink(phead);
while(1){
printf("plase input:Tom,huang or lin\n");
scanf("%s",buf);
ptmp = findUtilByName(buf,phead);
if(ptmp != NULL){
ptmp->peat();
ptmp->pbeat();
}
memset(buf,'\0',sizeof(buf));
}
return 0;
}
运行效果:
lbw@ubuntu:~/Desktop/factory$ gcc *.c -o fac
lbw@ubuntu:~/Desktop/factory$ ./fac
plase input:Tom,huang or lin
Tom
Cat eat fish
grasp
plase input:Tom,huang or lin
huang
Dog eat bones
bite
plase input:Tom,huang or lin
lin
human eat rice
beat
plase input:Tom,huang or lin