锅炉信息网 > 锅炉知识 > 锅炉学习

C语言工厂模式

最近看涂鸦的代码的时候,发现里面有很多这类的作用,周末有时间,就来说说工厂模式。比如我们在调试外设设备的时候,如果用到工厂模式,会

最近看涂鸦的代码的时候,发现里面有很多这类的作用,周末有时间,就来说说工厂模式。

比如我们在调试外设设备的时候,如果用到工厂模式,会非常有利我们的代码构建。

比如,我们需要调试两款触摸屏设备汇顶和墩泰

void gt_init(void)n{n}nnint gt_open(void)n{nn}nint gt_get_point(void)n{nn}


然后如果是敦泰的触摸屏

void ft_init(void)n{n}nnint ft_open(void)n{nn}nint ft_get_point(void)n{nn}


使用的时候会这样

int point;nft_init();nft_open();ngt_init();ngt_open();nwhile(true){npoint = ft_get_point();npoint = gt_get_point();n}


那如果我们每次换一个触摸屏芯片厂家,这些初始化的东西,调用的位置,都需要修改,这是非常麻烦的。有没有什么办法实现一些统一呢?

这就是我们标题说的工厂模式。

我们给触摸屏的方法做统一,如果后面的触摸屏驱动实现了这样的方法,在调用的时候就会去执行。

/*ntouch_factory.hnCopyright(C),2022n*/ntypedef struct touch_screen {n char *name;n void (*init)(void);n void (*open)(void);n int (*get_point)();n} * touch_screen_t;nntouch_screen_t touch_screen_factory(char *name);

返回句柄实现

/*ntouch_factory.cnCopyright(C),2022n*/nstruct touch_screen touch_screen_list[] ={n {"goodix", gt_init, gt_open, gt_get_point},n {"ftt", ft_init, ft_open, ft_get_point},n};nntouch_screen_t touch_screen_factory(char *name) {n int i;nn for (i = 0; i < sizeof(touch_screen_list) / sizeof(touch_screen_list[0]); i++)n {n if (0 == strcmp(name, touch_screen_list[i].name))n {n touch_screen_list[i].init();n touch_screen_list[i].open();n return &touch_screen_list[i];n }n }nn return NULL;n}


调用的地方

/*nmain.cnCopyright(C),2022n*/n#include "touch_factory.h"nnint main(void)n{n touch_screen_t ft_touch= touch_screen_factory("ft");n touch_screen_t gt_touch= touch_screen_factory("goodix");nn ft_touch->init();n ft_touch->open();n ft_touch->get_point();n gt_touch->init();n gt_touch->open();n gt_touch->get_point();n}


这就是我所理解的工厂模式了

但是在C++上实现就会相对简单,C++有父类和纯虚函数,把方法定义成纯虚函数,子类继承父类并重载纯虚函数的方法,就达到了我们想要的目的了。

上一篇:自建小型狗粮厂需要哪些设备

下一篇:保定全自动洗地机|唐山卡赫车站洗地机

锅炉资讯

锅炉资讯

锅炉学习

锅炉学习

锅炉视频

锅炉视频

锅炉百科

锅炉百科