本文共 2072 字,大约阅读时间需要 6 分钟。
工厂模式在软件设计中是一种常用的创建型模式,它通过引入一个统一的接口来创建对象,从而避免了直接暴露对象创建的逻辑。这种设计方式让工厂类负责对象的创建过程,客户端只需通过接口来获取所需对象,而无需关心对象的具体创建方式。
在C语言中,工厂模式的实现可以通过将不同对象的创建逻辑封装到各自的文件中,并通过函数接口暴露给主程序。这种方法使得主程序只需调用工厂函数,通过工厂函数获取所需对象,而无需直接处理对象的创建细节。
以下是C语言中工厂模式的实现步骤:
首先,我们定义一个通用的对象结构struct Animal
,它包含了对象的基本属性和方法。每个具体的动物(如狗、猫、人)都继承自struct Animal
,并实现自己的特定方法。
struct Animal { char name[128]; int age; int sex; void (*peat)(); void (*pbeat)(); struct Animal *next; // 用于链表结构};
接下来,我们在各自的文件中定义具体的动物对象,并实现它们的特定方法。
// dog.cstruct Animal dog = { .name = "狗", .peat = dogeat, .pbeat = dogbeat};
// cat.cstruct Animal cat = { .name = "猫", .peat = cateat, .pbeat = catbeat};
// person.cstruct Animal person = { .name = "人", .peat = personeat, .pbeat = personbeat};
我们通过工厂函数将各个具体对象注册到一个链表中。工厂函数接收一个链表头指针,返回注册后的链表头指针。
// cat.cstruct Animal* putCatInLink(struct Animal *phead) { if (phead == NULL) { return &cat; } else { cat.next = phead; phead = &cat; return phead; }}
// dog.cstruct Animal* putDogInLink(struct Animal *phead) { if (phead == NULL) { return &dog; } else { dog.next = phead; phead = &dog; return phead; }}
// person.cstruct Animal* putPersonInLink(struct Animal *phead) { if (phead == NULL) { return &person; } else { person.next = phead; phead = &person; return phead; }}
在主程序中,我们通过调用工厂函数,将所有具体对象注册到链表中,并逐个调用它们的方法。
// mainpro.c#include "animal.h"int main() { struct Animal *phead = NULL; phead = putCatInLink(phead); phead = putDogInLink(phead); phead = putPersonInLink(phead); // 调用各个对象的方法 while (phead) { phead->peat(); printf("%s %d岁的%s\n", phead->name, phead->age, phead->name); phead = phead->next; } return 0;}
工厂模式通过引入工厂函数,将对象的创建逻辑从客户端代码中隔离,使得系统更加灵活和可扩展。在C语言中,通过链表的方式实现工厂模式,可以有效地管理和扩展不同对象的创建逻辑。
转载地址:http://hxgfk.baihongyu.com/