抽象工厂模式-C语言实现

说明:

均由 chatgpt生成,实例可以看出无法运行,仅供参考~

抽象工厂模式:
代码实现:
cpp 复制代码
#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)是一种创建型设计模式,它提供了一个接口或抽象类,用于创建相关或依赖对象的家族,而不需要指定具体的类。抽象工厂模式通过封装一组相关的产品对象的创建逻辑,使得客户端可以通过统一的接口来创建这些产品对象。

优点:

  1. 将产品家族的创建和使用分离:抽象工厂模式将产品家族的创建逻辑集中在一个工厂类中,使得客户端无需关心具体的产品创建细节。客户端只需要通过抽象工厂接口来创建产品对象,从而将产品的使用与产品的创建解耦。
  2. 提供一致性的产品族:抽象工厂模式确保了一组相关的产品对象能够一起使用,保证了产品之间的兼容性和一致性。
  3. 便于交换产品系列:由于抽象工厂模式将产品的创建逻辑封装在具体的工厂类中,当需要更换产品系列时,只需切换具体的工厂类即可。

缺点:

  1. 不易扩展新的产品:当需要新增产品时,需要修改所有的具体工厂类,违反了开闭原则。这意味着每次新增产品都需要修改抽象工厂和所有具体工厂的代码,可能导致代码变得庞大而复杂。
  2. 增加了系统的抽象性和复杂性:引入抽象工厂模式会增加额外的抽象层,使得系统更加复杂,对于简单的产品结构和需求较少的系统可能会显得过度设计。

适用场景:

抽象工厂模式适用于以下情况:

  1. 系统需要一组相关的产品对象,并且这些产品对象之间有一定的约束或依赖关系。
  2. 客户端希望只使用产品的抽象接口,而无需关心具体的产品实现细节。
  3. 需要在运行时动态切换不同的产品系列。

需要注意的是,抽象工厂模式适合处理产品族的创建,而不适合处理单个产品的创建。如果只涉及单个产品的创建,可以考虑使用工厂方法模式。另外,抽象工厂模式在系统中增加了抽象性,如果系统规模较小或者产品结构简单,可能会显得过度设计,此时可以考虑使用简单工厂模式。

相关推荐
何遇mirror2 天前
抽象工厂模式(Abstract Factory)
抽象工厂模式
collman2 天前
抽象工厂模式
抽象工厂模式
学步_技术2 天前
Python编码系列—Python抽象工厂模式:构建复杂对象家族的蓝图
开发语言·python·抽象工厂模式
仙魁XAN2 天前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
java_heartLake5 天前
设计模式之抽象工厂模式
设计模式·抽象工厂模式
学计算机的小花神7 天前
设计模式篇--抽象工厂模式
java·设计模式·抽象工厂模式
coffee_baby11 天前
Java实现常见的工厂模式(包含在Springboot中实战开发)
java·后端·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·工厂模式
Aloha_up11 天前
抽象工厂模式abstract factory
抽象工厂模式
anyup_前端梦工厂21 天前
JS设计模式之“幽灵工厂” - 抽象工厂模式
javascript·设计模式·抽象工厂模式
开出南方的花22 天前
python进阶篇-day02-面向对象高级
开发语言·python·django·virtualenv·pip·抽象工厂模式·结对编程