说明:
均由 chatgpt生成,实例可以看出无法运行,仅供参考~
抽象工厂模式:
代码实现:
#include <stdio.h>
// 定义抽象产品接口
typedef struct {
void (*operation)();
} AbstractProductA;
typedef struct {
void (*operation)();
} AbstractProductB;
// 具体产品A1
typedef struct {
AbstractProductA abstractProductA;
} ConcreteProductA1;
void ConcreteProductA1_operation() {
printf("具体产品 A1 的操作\n");
}
// 具体产品A2
typedef struct {
AbstractProductA abstractProductA;
} ConcreteProductA2;
void ConcreteProductA2_operation() {
printf("具体产品 A2 的操作\n");
}
// 具体产品B1
typedef struct {
AbstractProductB abstractProductB;
} ConcreteProductB1;
void ConcreteProductB1_operation() {
printf("具体产品 B1 的操作\n");
}
// 具体产品B2
typedef struct {
AbstractProductB abstractProductB;
} ConcreteProductB2;
void ConcreteProductB2_operation() {
printf("具体产品 B2 的操作\n");
}
// 定义抽象工厂接口
typedef struct {
AbstractProductA* (*createProductA)();
AbstractProductB* (*createProductB)();
} AbstractFactory;
// 具体工厂1
typedef struct {
AbstractFactory abstractFactory;
} ConcreteFactory1;
AbstractProductA* ConcreteFactory1_createProductA() {
return (AbstractProductA*)malloc(sizeof(ConcreteProductA1));
}
AbstractProductB* ConcreteFactory1_createProductB() {
return (AbstractProductB*)malloc(sizeof(ConcreteProductB1));
}
// 具体工厂2
typedef struct {
AbstractFactory abstractFactory;
} ConcreteFactory2;
AbstractProductA* ConcreteFactory2_createProductA() {
return (AbstractProductA*)malloc(sizeof(ConcreteProductA2));
}
AbstractProductB* ConcreteFactory2_createProductB() {
return (AbstractProductB*)malloc(sizeof(ConcreteProductB2));
}
int main() {
AbstractFactory* factory1 = (AbstractFactory*)malloc(sizeof(ConcreteFactory1));
factory1->createProductA = ConcreteFactory1_createProductA;
factory1->createProductB = ConcreteFactory1_createProductB;
AbstractProductA* productA1 = factory1->createProductA();
AbstractProductB* productB1 = factory1->createProductB();
productA1->operation();
productB1->operation();
free(productA1);
free(productB1);
AbstractFactory* factory2 = (AbstractFactory*)malloc(sizeof(ConcreteFactory2));
factory2->createProductA = ConcreteFactory2_createProductA;
factory2->createProductB = ConcreteFactory2_createProductB;
AbstractProductA* productA2 = factory2->createProductA();
AbstractProductB* productB2 = factory2->createProductB();
productA2->operation();
productB2->operation();
free(productA2);
free(productB2);
free(factory1);
free(factory2);
return 0;
}
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口或抽象类,用于创建相关或依赖对象的家族,而不需要指定具体的类。抽象工厂模式通过封装一组相关的产品对象的创建逻辑,使得客户端可以通过统一的接口来创建这些产品对象。
优点:
- 将产品家族的创建和使用分离:抽象工厂模式将产品家族的创建逻辑集中在一个工厂类中,使得客户端无需关心具体的产品创建细节。客户端只需要通过抽象工厂接口来创建产品对象,从而将产品的使用与产品的创建解耦。
- 提供一致性的产品族:抽象工厂模式确保了一组相关的产品对象能够一起使用,保证了产品之间的兼容性和一致性。
- 便于交换产品系列:由于抽象工厂模式将产品的创建逻辑封装在具体的工厂类中,当需要更换产品系列时,只需切换具体的工厂类即可。
缺点:
- 不易扩展新的产品:当需要新增产品时,需要修改所有的具体工厂类,违反了开闭原则。这意味着每次新增产品都需要修改抽象工厂和所有具体工厂的代码,可能导致代码变得庞大而复杂。
- 增加了系统的抽象性和复杂性:引入抽象工厂模式会增加额外的抽象层,使得系统更加复杂,对于简单的产品结构和需求较少的系统可能会显得过度设计。
适用场景:
抽象工厂模式适用于以下情况:
- 系统需要一组相关的产品对象,并且这些产品对象之间有一定的约束或依赖关系。
- 客户端希望只使用产品的抽象接口,而无需关心具体的产品实现细节。
- 需要在运行时动态切换不同的产品系列。
需要注意的是,抽象工厂模式适合处理产品族的创建,而不适合处理单个产品的创建。如果只涉及单个产品的创建,可以考虑使用工厂方法模式。另外,抽象工厂模式在系统中增加了抽象性,如果系统规模较小或者产品结构简单,可能会显得过度设计,此时可以考虑使用简单工厂模式。