基于C的工厂模式

什么是设计模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。

设计模式通常描述了一组相互紧密作用的类与对象。(java)
c:面向过程,一种不太友好的面向对象语言
java:面向对象
建筑设计领域引入到计算机科学中来的

什么是类和对象

:是一种用户定义的引用数据类型,也称类类型,结构体。
对象:类的一种具象。

#include <stdio.h>

struct Animal{
	char name[128];
	int age;
	int sex;
	int others;
	void (*peat)();
	void (*pbeat)();
	void (*test)();
};

void dogEat()
{
	printf("狗--dog\n");
}

void catEat()
{
	printf("猫--cat\n");
}

void personEat()
{
	printf("人吃米\n");
}

int main()
{
	struct Animal dog = {
		.peat = dogEat,
	};
	struct Animal cat = {
		.peat = catEat
	};
	struct Animal person = {
		.peat = personEat
	};
	dog.peat();
	cat.peat();
	person.peat();
	
	return 0;
}

工厂模式概念引入

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

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

下面是基于C实现的工厂模式

Animal.h

#include <stdio.h>

struct Animal
{
	char name[128];
	int age;
	
	void (*peat)();
	void (*pbeat)();
		
	struct Animal *next;
};

struct Animal* putCatLink(struct Animal *phead);
struct Animal* putDogInLink(struct Animal *phead);
struct Animal *putPersonInLine(struct Animal *head);

cat.c

#include "Animal.h"

void catEat()
{
	printf("cat eat fish\n");
}

void catBeat()
{
	printf("cat beat your brother\n");
}

struct Animal cat = {
	.name = "Tom",
	.peat = catEat,
	.pbeat = catBeat
};

struct Animal* putCatLink(struct Animal *phead)
{
	if(phead == NULL){
		phead = &cat;
	}else{
		cat.next = phead;
		phead = &cat;
	}
	return phead;
}

dog.c

#include "Animal.h"

void dogEat()
{
	printf("dog eat shit\n");
}
void dogBeat()
{
	printf("dog bite your litter brother\n");
}

struct Animal dog = {
	.name = "huang",
	.peat = dogEat,
	.pbeat = dogBeat
};


struct Animal* putDogInLink(struct Animal *phead)
{
	if(phead == NULL){
		phead = &dog;
	}else{
		dog.next = phead;
		phead = &dog;
	}
	return phead;
}

person.c

#include "Animal.h"

void personEat()
{
	printf("person eat meat\n");
}

void personBeat()
{
	printf("person beaat eachother\n");
}

struct Animal person = {
	.name = "dzz",
	.peat = personEat,
	.pbeat = personBeat
};

struct Animal *putPersonInLine(struct Animal *head)
{
	if(head == NULL)
	{
		head = &person;
	}else
	{
		person.next = head;
		head = &person;
	}
	return head;
}

mainpro.c

#include "Animal.h"
#include <string.h>

struct Animal* findUtilByName(char *str, struct Animal *pthead)
{
	struct Animal *p = pthead;
	if(p == NULL){
		printf("error in link\n");
		return NULL;		
	}else{
		while(p != NULL){
			if(strcmp(str, p->name) == 0){
				return p;
			}
			p = p->next;
		}
		return NULL;
	}
}

int main()
{
	char buf[128] = {'\0'};
	struct Animal *phead = NULL;
	struct Animal *ptmp = NULL;

	phead = putCatLink(phead);
	phead = putDogInLink(phead);
	phead = putPersonInLine(phead);
	phead = putMaLink(phead);
	
	while(1){
		printf("Input: Tom, huang, ma, dzz\n");
		scanf("%s", buf);
		ptmp = findUtilByName(buf, phead);
		if(ptmp != NULL){
			ptmp->pbeat();
			ptmp->peat();
		}
		memset(buf, '\0', sizeof(buf));
	}

	return 0;
}

编译:

gcc *.c
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值