设计模式——工厂模式

为啥学设计模式

设计模式有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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从入门到捕蛇者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值