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

ops/2024/9/22 22:36:51/

在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.ppmy.cn/ops/114444.html

相关文章

数据库提权【笔记总结】

文章目录 UDF提权以有webshell只有数据库权限条件复现msf工具sql语句提权 MOF提权前言条件复现msf工具php脚本提权 sqlserver提权前言条件xp_cmdshell提权复现 沙盒提权介绍复现 Oracle提权靶场搭建执行任意命令复现 通过注入存储过程提权&#xff08;低权限提升至DBA&#xff…

ELK 企业级日志分析系统

1、ELK概述 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ELK 是 Elasticsearch、Logstash、Kibana 的缩写&#xff0c;这三个工具组合在一…

阿里1688一面总结

首先&#xff0c;面试官进行对业务进行介绍&#xff0c;然后&#xff0c;候选人进行自我介绍。 面试官根据候选人经历进行提问。 候选人针对想了解的事情进行提问。 接下来主要是对面试官的问题进行记录&#xff1a; 在容量管理优化查询逻辑里面&#xff0c;集群及单机信息是…

Vue学习记录之五(组件/生命周期)

一、组件 在每一个.vue文件可以看作是一个组件&#xff0c;组件是可以复用的&#xff0c;每个应用可以看作是一棵嵌套的组件树。 在Vue3中&#xff0c;组件导入以后即可直接使用。 二、组件的生命周期 生命周期就是从诞生(创建)到死亡(销毁) 的过程。 Vue3 组合式API中(se…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣653

1. 力扣653&#xff1a;两数之和IV - 输入二叉搜索树 1.1 题目&#xff1a; 给定一个二叉搜索树 root 和一个目标结果 k&#xff0c;如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果&#xff0c;则返回 true。 示例 1&#xff1a; 输入: root [5,3,6,2,4,null,7…

Spring Cloud Gateway组件

Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件&#xff0c;它基于Spring Framework 5、Spring Boot 2和Project Reactor等技 术构建&#xff0c;为微服务架构提供了强大且灵活的网关服务。以下是对Spring Cloud Gateway的详细介绍&#xff1a;一、概述 Spring …

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器

文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;&#xff0c;顾名思义就是释放垃圾占用的空…

PostgreSQL配置主从同步

PostgreSQL配置主从同步 1 主、备库安装postgresql软件 su - pg12 cd /home/pg12/resource tar -zxvf postgresql-12.9.tar.gz cd postgresql-12.9/ ./configure --prefix/home/pg12/soft/ make -j 16 && make install2 主、备库配置环境变量 vi ~/.bash_profile…