当前位置: 首页 > news >正文

设计模式中工厂模式的C语言实现

在C语言中实现工厂模式(Factory Pattern)通常需要模拟面向对象的编程方式。工厂模式的核心思想是通过工厂函数来创建不同类型的对象,隐藏对象创建的细节。下面是一个简单的工厂模式在C语言中的实现。

工厂模式示例:几何形状工厂

我们将模拟一个工厂来创建不同的几何形状对象(例如:圆形、矩形、三角形),每个几何形状都有一个 draw 方法。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义抽象的 Shape 接口
typedef struct Shape {void (*draw)(struct Shape*);  // 函数指针,用于表示多态的 draw 方法
} Shape;// 定义圆形结构体
typedef struct Circle {Shape base;  // 基础 Shape 类型
} Circle;// 定义矩形结构体
typedef struct Rectangle {Shape base;  // 基础 Shape 类型
} Rectangle;// 定义三角形结构体
typedef struct Triangle {Shape base;  // 基础 Shape 类型
} Triangle;// 实现 Circle 的 draw 方法
void drawCircle(Shape* shape) {printf("Drawing a Circle.\n");
}// 实现 Rectangle 的 draw 方法
void drawRectangle(Shape* shape) {printf("Drawing a Rectangle.\n");
}// 实现 Triangle 的 draw 方法
void drawTriangle(Shape* shape) {printf("Drawing a Triangle.\n");
}// 工厂函数,用于创建不同类型的 Shape 对象
Shape* createShape(const char* shapeType) {if (strcmp(shapeType, "Circle") == 0) {Circle* circle = (Circle*)malloc(sizeof(Circle));circle->base.draw = drawCircle;  // 绑定 Circle 的 draw 方法return (Shape*)circle;} else if (strcmp(shapeType, "Rectangle") == 0) {Rectangle* rectangle = (Rectangle*)malloc(sizeof(Rectangle));rectangle->base.draw = drawRectangle;  // 绑定 Rectangle 的 draw 方法return (Shape*)rectangle;} else if (strcmp(shapeType, "Triangle") == 0) {Triangle* triangle = (Triangle*)malloc(sizeof(Triangle));triangle->base.draw = drawTriangle;  // 绑定 Triangle 的 draw 方法return (Shape*)triangle;}return NULL;
}// 释放内存
void destroyShape(Shape* shape) {if (shape != NULL) {free(shape);}
}int main() {// 创建 Circle 对象Shape* circle = createShape("Circle");if (circle != NULL) {circle->draw(circle);  // 输出: Drawing a Circle.destroyShape(circle);}// 创建 Rectangle 对象Shape* rectangle = createShape("Rectangle");if (rectangle != NULL) {rectangle->draw(rectangle);  // 输出: Drawing a Rectangle.destroyShape(rectangle);}// 创建 Triangle 对象Shape* triangle = createShape("Triangle");if (triangle != NULL) {triangle->draw(triangle);  // 输出: Drawing a Triangle.destroyShape(triangle);}return 0;
}

代码说明:

  1. 接口模拟Shape 结构体中包含一个函数指针 draw,用于模拟面向对象语言中的接口及多态行为。

  2. 具体类CircleRectangleTriangle 结构体都继承自 Shape(通过包含 Shape 结构体),每种形状都有自己具体的 draw 方法。

  3. 工厂函数createShape 函数通过传入的形状类型字符串(如 "Circle"、"Rectangle" 等)动态创建相应的对象,并返回 Shape* 类型的指针。

  4. 多态调用:在主函数中,通过调用 draw 函数指针,能够实现对具体对象的多态调用。

  5. 内存管理:工厂函数动态分配内存,因此在使用完对象后需要手动释放内存,避免内存泄漏。

这个设计模式在C语言中通过函数指针和结构体组合的方式来实现了类似面向对象的多态行为。


http://www.mrgr.cn/news/28877.html

相关文章:

  • AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)
  • 源码解析-Spring Eureka
  • rust模式和匹配
  • 如何开展小组讨论以强化员工对六西格玛的关注度?
  • HarmonyOS Next 实战卡片开发 02
  • Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
  • 网络安全笔试练习题,据说10分钟内答对的都是高手!
  • 算法题之回文子串
  • 【C++】——优先级队列和容器适配器
  • 算法题总结(一)——二分查找专题
  • 【Linux:命名管道】
  • 【云原生监控】Prometheus之Alertmanager报警
  • ElasticSearch-2-核心语法集群高可用实战-Week2
  • 大学生涯规划
  • 随着访问范围的扩大 OpenAI o1-mini 现已向免费用户开放
  • Makefile语法详解
  • 为什么你亏几十个点都可以扛,才赚几个点却想逃
  • 【Android】sendevent和getevent
  • day21JS-axios数据通信
  • osg中显示3dtiles和cesiumIon
  • 一键更换软件源的工具——chsrc
  • fiddler抓包02_安装
  • Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用增强版
  • 经典sql题(七)查找直播间最大在线人数
  • 【算法】差分思想:强大的算法技巧
  • 【补充篇】Davinci工具要求的dbc格式