轻松网站建设,台州seo排名扣费,百度搜自己的网站,wordpress 主题 英文概念#xff1a;
代码的工厂模式是一种设计模式#xff0c;用于创建对象实例而无需直接调用构造函数。它提供了一种更加灵活和可维护的方式来创建对象#xff0c;尤其是在需要根据不同情况创建不同类型的对象时非常有用。工厂模式隐藏了对象的创建细节#xff0c;使代码更…概念
代码的工厂模式是一种设计模式用于创建对象实例而无需直接调用构造函数。它提供了一种更加灵活和可维护的方式来创建对象尤其是在需要根据不同情况创建不同类型的对象时非常有用。工厂模式隐藏了对象的创建细节使代码更加模块化和可扩展。 包括的关键元素 工厂方法Factory Method这是一个方法或函数负责创建对象实例。工厂方法通常接受一些参数根据这些参数来确定应该创建哪种类型的对象。 产品Product产品是工厂方法创建的对象实例。产品通常是某个类的实例。 具体工厂Concrete Factory具体工厂是实际执行对象创建的类或函数。每个具体工厂通常负责创建特定类型的产品。 具体产品Concrete Product具体产品是由具体工厂创建的对象实例它们是产品的具体实现。 工厂模式的主要优点 封装对象创建过程工厂模式将对象的创建逻辑封装在一个函数或类中使客户端代码无需关心对象的具体创建方式。这可以减少代码的重复性提高代码的可维护性和可读性。 灵活性通过工厂模式可以轻松地更改对象的创建方式例如切换到不同的实现类或版本而无需修改大量客户端代码。 解耦合工厂模式有助于减少类之间的直接依赖关系。客户端代码不需要了解对象的具体类只需与工厂接口或函数交互。这降低了耦合度使系统更容易维护和扩展。 单一职责原则工厂模式有助于遵循单一职责原则因为它将对象的创建职责从客户端代码中分离出来并将其委托给专门的工厂类或函数。 代码组织工厂模式可以帮助组织代码将对象创建逻辑集中在一个地方使代码更加结构化和清晰。 测试和调试工厂模式使得在单元测试中更容易替换模拟对象从而更容易进行单元测试和调试。
总之工厂模式是一种设计模式有助于提高代码的可维护性、可扩展性和可测试性同时降低了代码的耦合度是面向对象编程中常用的一种设计方法之一。 代码案例 源代码
#include stdio.hstruct Animal
{char name[128];int age;int sex;int others;void (*peat)();void (*pbeat)();void (*test)();
};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;
}
工厂模式之后
自行分开成一个个子文件
#include stdio.h// 定义动物结构体
struct Animal
{char name[128];int age;int sex;int others;void (*eat)();void (*beat)();
};// 定义不同类型的吃函数
void dogEat()
{printf(狗吃屎\n);
}void catEat()
{printf(猫吃鱼\n);
}void personEat()
{printf(人吃米\n);
}// 定义不同类型的打函数
void dogBeat()
{printf(狗咬你\n);
}void catBeat()
{printf(猫咬你\n);
}void personBeat()
{printf(人打你\n);
}// 创建动物工厂函数
struct Animal createAnimal(void (*eatFunc)(), void (*beatFunc)())
{struct Animal animal;animal.eat eatFunc;animal.beat beatFunc;return animal;
}int main()
{// 使用工厂函数创建不同类型的动物对象struct Animal dog createAnimal(dogEat, dogBeat);struct Animal cat createAnimal(catEat, catBeat);struct Animal person createAnimal(personEat, personBeat);// 调用动物对象的方法dog.eat();cat.eat();person.eat();dog.beat();cat.beat();person.beat();return 0;
}在上面的代码中我们创建了一个createAnimal函数它接受两个函数指针作为参数并返回一个初始化好的动物对象。然后在main函数中我们使用createAnimal函数来创建不同类型的动物对象然后调用它们的吃和打方法。这样就实现了工厂模式使得创建和使用不同类型的动物对象更加灵活和可维护。
如何理解这个模式的关键点 抽象对象类型在代码中抽象对象类型是struct Animal它定义了动物对象的通用属性和行为。这个抽象类型充当了工厂模式中的产品。 具体对象类型不同种类的动物狗、猫、人被表示为具体对象类型每个具体对象类型都有不同的实现包括吃和打两个行为。这些具体对象类型充当了工厂模式中的具体产品。 工厂函数createAnimal函数是工厂函数它接受不同的参数吃和打的函数指针来创建不同类型的动物对象。这个工厂函数充当了工厂模式中的工厂它负责创建具体产品。 客户端代码在main函数中客户端代码使用工厂函数来创建不同类型的动物对象而不需要知道如何构造这些对象的细节。客户端只关心如何使用这些对象而不关心它们的创建过程。 用链表写法太麻烦也发出来吧。
#include stdio.h
#include string.h
#include stdlib.h// 定义动物结构体
struct Animal
{char name[128]; // 动物的名字void (*peat)(); // 吃的行为函数指针void (*pbeat)(); // 攻击的行为函数指针struct Animal *next; // 指向下一个动物的指针
};// dog
void dogEat()
{printf(狗吃屎\n);
}
void dogBeat()
{printf(狗咬你\n);
}
struct Animal dog {.name Pike,.peat dogEat,.pbeat dogBeat,.next NULL
};// cat
void catEat()
{printf(猫吃鱼\n);
}
void catBeat()
{printf(猫咬你\n);
}
struct Animal cat {.name Tom,.peat catEat,.pbeat catBeat,.next NULL
};// person
void personEat()
{printf(人吃米\n);
}
void personBeat()
{printf(人打你\n);
}
struct Animal person {.name Lihua,.peat personEat,.pbeat personBeat,.next NULL
};// 向链表中添加动物
struct Animal *putAnimal(struct Animal *phead, struct Animal *animal)
{if (phead NULL){phead animal;}else{animal-next phead;phead animal;}return phead;
}// 根据名字查找动物
struct Animal *findName(char *str, struct Animal *phead)
{struct Animal *tmp phead;if (phead NULL){return NULL;}else{while (tmp ! NULL){if (strcmp(tmp-name, str) 0){return tmp;}tmp tmp-next;}}return NULL;
}int main()
{char buf[128] {\0};struct Animal *phead NULL;struct Animal *ptmp;// 向链表中添加动物phead putAnimal(phead, dog);phead putAnimal(phead, cat);phead putAnimal(phead, person);while (1){printf(请输入Pike、Tom、Lihua\n);scanf(%s, buf);struct Animal *ptmp findName(buf, phead);if (ptmp ! NULL){printf(姓名%s\n, ptmp-name);ptmp-peat();ptmp-pbeat();}memset(buf, \0, sizeof(buf));}return 0;
}