IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 设计模式 —— 简单工厂模式(C语言) -> 正文阅读

[C++知识库]设计模式 —— 简单工厂模式(C语言)

? ? ? ? 简单工厂模式一般在面向对象语言中用得较多,但C语言也可以实现,在做项目的时候可以加入到工程中去,使工程逻辑更加清楚,但工程小的话就没必要用,工程稍微大点使用该设计模式就会很方便,比如我们在使用树莓派或者其它板子做项目时会涉及很多的传感器或者其它电子器件,器件多,代码长,还要考虑代码的稳定性,后期的维护等,像这种情况就可以用这种设计模式来进行写代码。

这种设计方法涉及到了C语言的函数指针,结构体,以及链表的一些相关知识,具体实现方法入下:

现有5个文件:main.c 、led1.c、led2.c、led3.c以及led.h,分别如下

led1.c文件如下:

#include "led.h"
int led1open(int pinNum)
{
	digitalWrite(pinNum,LOW);
}
int led1close(int pinNum)
{
	digitalWrite(pinNum,HIGH);
}
int ledinit(int PinNum)
{
	pinMode(PinNum,OUTPUT);
}
int led1Status(int Ptatus)
{
}
struct Devices led_Init = {

	.pinNum = 22,
	.devicesName  = "led1",        
	.open         = led1open,
	.close        = led1close,
	.devicesInit  = ledinit ,
	.changeStatus = led1Status
};
struct Devices* addLed1LightToLink(struct Devices *phead)
{
	if(phead == NULL){    
		return &led1;         //led1作为头结点
	}else{
		led1.next = phead;
		phead = &led1;
	}
}

led1.c文件主要是实现相关的功能,将每个功能都用函数指针进行封装,addLed1LightToLink函数是将该设备加入到链表,方便后面的使用。

led2.cl和ed3.c与上述类似,只是将有led1的地方改为led2和led3即可,引脚号也要改一下。

led.h文件如下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
struct Devices* addLed1LightToLink(struct Devices *phead);
struct Devices* addLed2LightToLink(struct Devices *phead);
struct Devices* addLed3LightToLink(struct Devices *phead);
struct Devices{
	char devicesName[128];
	int status;
	int pinNum;
	int (*open)(int PinNum);
	int (*close)(int PinNum);
	int (*devicesInit)(int PinNum);
	int (*readStatus)(int pinNum);
	int (*changeStatus)(int status);
    bool (*postUrl)(void);
	void (*cam)(void);
	struct Devices* next;
};

led.h文件主要是声明了Devices 结构体,结构体里面定义了非常多的函数指针,因为模块有很多,不止有led文件,每个模块都可将实现功能部分在自己的文件里面写成如led1.c这样,然后在结构体中定义自己需要的函数指针(led的功能是很简单的,这里只是示范,如果工程很简单的话,就没必要这样做)。

main.c文件如下:

#include "led.h"
struct Devices * findDeviceByname(char * name, struct Devices * phead)
{   //通过设备名字从链表中寻找是否有该设备
	struct Devices * tmp = phead;
	if (tmp == NULL){
		return NULL;
	}else{
		while (tmp != NULL){
			if (strcmp(tmp->devicesName, name) == 0){
				return tmp;
			}
			tmp = tmp->next;
		}
		return NULL;
	}
}
int main()
{
struct Devices * led1 = NULL;
struct Devices * led2 = NULL;
struct Devices * led3 = NULL;
struct Devices * pdeviceHead = NULL;           //定义头结点
pdeviceHead = addLed1LightToLink(pdeviceHead); //将led1加入到链表中去
pdeviceHead = addLed2LightToLink(pdeviceHead); //将led2加入到链表中去
pdeviceHead = addLed3LightToLink(pdeviceHead); //将led3加入到链表中去

led1 = findDeviceByname("led1", pdeviceHead);  //找led1引脚节点
if(led1 != NULL){                              //条件成立则表示从链表中找到了led1节点
    while(1){
        led1 ->devicesInit(led1 ->pinNum);	   //初始化led1引脚
        led1 ->open(led1 ->pinNum);		       //打开led1
	    sleep(1);                              //延时1s
	    led1 ->close(led1 ->pinNum);		   //关闭led1
	    sleep(1);
    }
}
    return 0;
}

在main.c文件中先将3个led设备通过调用addLed1LightToLink函数将各个设备添加到链表中去,函数?findDeviceByname 是通过设备名来遍历链表中的设备的,如果找到该设备则可以对其进行下一步操作。

结构体是整个模式的关键,根据外界给定的信息,决定究竟应该执行什么操作,使用工厂模式,用户仅仅需要知道怎样使用接口就可以了,而不用关系内部这些代码究竟是如何创建以及代码逻辑是什么样的,明确了用户和厂家的职责和权利,有利于整个工程体系结构的优化。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:47:31  更:2022-12-25 10:49:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 5:21:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码