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++有父类和纯虚函数,把方法定义成纯虚函数,子类继承父类并重载纯虚函数的方法,就达到了我们想要的目的了。
上一篇:自建小型狗粮厂需要哪些设备