用C语言实现简单工厂模式!

一.背景介绍

在我们的印象中,设计模式是由面向对象的语言(C++、JAVA)才能完成的,而C语言是面向过程的语言,不能实现设计模式。C语言中有 函数指针回调函数 等机制,使用这些机制便能写出面向对象的优秀程序。

LINUX操作系统,采用的就是C语言写的,但是里面很多模块实现都是通过面向对象的设计方式实现的,这也是很多人初看Linux源码看得云里雾里的原因。

面向过程(Procedure Oriented 简称 PO): 把事情拆分成几个步骤(相当于拆分成一个个的方法和数据),然后按照一定的顺序执行。

面向对象(Object Oriented 简称 OO): 面向对象会把事物抽象成对象的概念,先抽象出对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法。

二.设计实现

在C++中实现设计模式主要是通过virtual关键字修饰的虚函数来实现的,在C语言中没有这个操作,但是我们可以通过指针函数加结构体进行实现。我们先简单了解一下指针函数:

typedef void (*pfunc)(int); //此处定义了pfunc这个函数指针//定义一个test_func函数,与pfunc的返回类型和参数是一致的,只有名字不同
//若不一致则不能定义pfunc的指针指向test_func
void test_func(int id)
{   printf("id=%d \n", id);
}//使用func指向test_func()
pfunc func = test_func;//调用func(id) 与 test_func(id)实现的功能一致
func(1);//即可使用//与结构体结合
typedef struct func_t
{void (*func)(int id);
}func_t;func_t f;
f.func = test_func; //结构体的函数指针指向test_func()
f.func(1); //调用结构体的函数指针,与调用test_func(1)效果一致//通过上述例子,我们可以看到通过结构体+函数指针可以实现封装信息并指向另外一个函数
//有了这个特性我们可以实现一个简单工厂模式

本设计实现一个简单的工厂模式,一个生产不同种类水果的工厂。每种水果有两个属性show() eat(),实现apple、banana、pear这3种水果。

//设计抽象定义接口
//定义的抽象的水果接口
typedef struct Ifruit_t
{void (*show)(void* obj);  //显示信息void (*eat)(void* obj);   //怎么吃void *obj;                //指向当前的结构体
}Ifruit_t;

下面程序是香蕉水果相关的定义, 另外的 苹果与梨 定义与这个几乎完全一致,此处考虑篇幅问题,不全部贴出来了。

//------------------------------------------------
//实现香蕉相关的定义
//------------------------------------------------
typedef struct banana_t             //与Ifruit_t的定义一致
{void (*show)(void* obj);        //显示信息void (*eat)(void* obj);         //怎么操作才能吃void *obj;                      //指向当前的结构体
}banana_t;static void banana_show(void* obj)   //使用static修饰,避免被外部直接调用
{printf("我是香蕉!\n");
}static void banana_eat(void* obj)  //使用static修饰,避免被外部直接调用
{printf("操作: 先剥掉皮,再吃!\n");
}
//香蕉的构造函数
banana_t* constructor_banana(void)  //不使用static修饰,让外部直接调用
{banana_t* obj = (banana_t*)malloc(sizeof(banana_t));obj->show = banana_show;        //给指针函数赋值,后面才能被调用obj->eat = banana_eat;//给指针函数赋值,后面才能被调用obj->obj = obj;                 //obj指向当前结构体指针return obj;
}

工厂实现的函数 如下:

enum FruitType  //枚举类型
{APPLE,      //苹果BANANA,     //香蕉PEAR,       //梨
};Ifruit_t* factor_create_fruit(enum FruitType type) //工厂:生成水果的
{Ifruit_t *fruit=NULL;switch (type){case APPLE:fruit = (Ifruit_t *)constructor_apple();printf("工厂: 生产苹果!\n");break;case BANANA:fruit = (Ifruit_t *)constructor_banana();printf("工厂: 生产香蕉!\n");break;case PEAR:fruit = (Ifruit_t *)constructor_pear();printf("工厂: 生产梨!\n");break;default:break;}return fruit;
}

main使用流程 如下。工厂设计模式它的优势是易于扩展,此处我们实现了香蕉、苹果、梨种水果,当业务中需要西瓜时,我们指向写一个西瓜相关的结构体并实现对应函数,实现方式和上面banana实现方式一致,而对于西瓜的使用依旧是如下调用 fruit->show(NULL); fruit->eat(NULL);,这样我们主体的业务逻辑便能完成以较小的改动来添加一个新的模块功能。

int main(void)
{Ifruit_t *fruit=NULL;fruit = factor_create_fruit(APPLE); //生成苹果//每一次有新的水果添加进来,步骤都和下面一样的,易于扩展fruit->show(NULL);                  //显示苹果fruit->eat(NULL);                   //操作苹果free(fruit);                        //不使用了,释放资源printf("\n");fruit = factor_create_fruit(BANANA);fruit->show(NULL);fruit->eat(NULL);free(fruit);printf("\n");fruit = factor_create_fruit(PEAR);fruit->show(NULL);fruit->eat(NULL);free(fruit);return 0;
}

三.运行测试

运行信息如下:

四.总结

虽然C语言是面向过程的编程语言,但是我们在设计程序的时候,可以考虑用面向对象的方式去设计,这样提高我们程序的“高内聚、低耦合”特性,便于维护。

想要整个工程文件的小伙伴:关注微信公众号【Linux编程用C】,在微信公众号回复 factor即可获取

我是小C,欢迎大家关注、点赞支持,我们一起交流讨论学习!

PS:若大家想看C语言版本的其他设计模式,

请大家 点赞! 转发!关注!催更吧~~

用C语言实现简单工厂模式!相关推荐

  1. C语言实现简单工厂模式

    1.简单工厂模式 工厂模式是面向对象语言的20多种的设计模式之一,也是比较常用,虽然C语言是一个面向过程的语言,但通过结构体与指针也能实现一些简单的面向对象.基于此,玩了一下C语言简单工厂模式. 工厂 ...

  2. 简单工厂模式(C语言实现)

    工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一. 简单工厂模式 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要 ...

  3. 设计模式 之美 -- 简单工厂模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现 C++实现: C语言实现 4. 缺点 1. 解决问题 举例如下: 我们实现一个卖衣服的功能,衣服的种类有很多:帽子,裤子,T恤... 每卖一种衣服 ...

  4. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式

    设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...

  5. 简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比

    先看各自的结构: 简单工厂模式(SimpleFactory Mode): 简单工厂模式的思路是,首先我们把一些共性的东西(算法)拿出来,进行抽象,比如加减乘除.然后我们在定义一个类作为工厂类,工厂类的 ...

  6. Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式

    一.继承的概念及用法       继承背后的思想就是        基于已存在的类来构建新类         当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...

  7. php的类图怎么生成_PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  8. [Python设计模式] 第1章 计算器——简单工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...

  9. 工厂三兄弟之简单工厂模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/9300337 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式, ...

最新文章

  1. 隐含狄利克雷分布(Latent Dirichlet Allocation,LDA)
  2. NeHe教程Qt实现——lesson14
  3. 数据库基本概念 - 表、字段、sql语句
  4. Oracle包和包体以及与非包体定义函数、过程的区别
  5. VS(visual studio)如何查看预处理后的文件?(查看宏定义展开,头文件展开等)(注意如果要运行或调试代码,要把第一步的改回来!!!!)
  6. 路由器的基本配置--荣新IT培训带给我的......(三)
  7. UNITY3D 脑袋顶血顶名
  8. scrapy爬虫-setting.py
  9. mysql 6.17_2020 6/17 mysql数据的增删改查
  10. ros开源课程_如何将开源纳入计算机科学课程
  11. pytorch加载之前训练模型中的部分参数以及冻结部分参数(实测,自己实际项目代码中的)
  12. Linux环境下FTP工具的使用方法
  13. Google趋势(Trends)有趣的关键词
  14. Processing 案例 | 三角函数之美
  15. 批量修改WORD文档密码
  16. 创业管理:创业者的十八般武艺——1.2 创业者素质体系(1)
  17. MATLAB指纹识别文献综述
  18. VUE3+Vite开发网易云音乐 Day1 后端环境搭建
  19. 菜鸟程序员如何才能快速提高自己的技术
  20. 白帽子和黑客的区别是什么?如何成为一名白客?这篇文章能给你所有答案

热门文章

  1. CentOS/Debian/Ubuntu永久保存iptables配置规则
  2. 这4件事,你知道吗?锤子回故乡,华为很随意,苹果傍大款
  3. python列表推导式[x for x in range(n)]
  4. 如何测试网页登录页面
  5. 群晖Docker安装gitlab-ce-zh中文版,并绑定阿里域名并启用https
  6. 最简单解决maven依赖报红 | 不用执行maven命令
  7. wlanFineCFOEstimate 详解
  8. 十位时间戳转化成时间
  9. 【长安大学】考研初试复试资料分享
  10. Mac下玩51单片机