C++:2.工厂模式
工厂模式主要解决同一类接口不同厂家有不同实现这类问题。以业务集成相机sdk为例相机常用到的功能有打开相机、读取流、关闭流、设置相机参数等。但不同厂家sdk实现方式不一样如果不用工厂模式那相同的业务代码可能要写很多份。使用后整体代码变得简洁耦合性好。下面举例说明。1.抽象相机基类基类中通常包含两类接口一类是通用接口这类接口和相机厂家无关但相机创建时候又都会用到。另一类是纯虚函数接口这类接口就是相机相关操作的抽象如打开相机等。基类头文件#ifndef _ICAMERA_H_ #define _ICAMERA_H_ #include string #include map class ICamera { public: ICamera(std::string cameraName) :name(cameraName) {}; /** * brief 加载本地图片仿真使用 * param cameraName * param simPicDir */ ICamera(std::string cameraName, std::string picDir); virtual ~ICamera() default; /*************************相机厂家重写*************************/ /** * brief 相机初始化 * return */ virtual void init(CameraManagePara cmPara) 0; /** * brief 设置相机参数 * param para * return */ virtual bool setParameter(CameraThreadPara para) 0; /** * brief 相机在线状态 * return */ virtual bool isOnline() 0; /** * brief 句柄是否有效 * return */ virtual bool isValidHandle() 0; /** * brief 关闭相机 */ virtual void close() 0; /** * brief 关闭流 * param */ virtual void stopGrab() 0; /*************************基类通用接口-厂家不需要实现*************************/ /** * brief 获取相机名称 * return */ std::string getCameraName(); /** * brief 可以抽取出来的通用逻辑 * return */ void commonFun(std::string picDir); public: /** * brief 通用成员变量 */ uint64_t frameTime 0; uint64_t frameId 0; /** * brief 相机名称 */ std::string name; }; #endif // !_ICAMERA_H_基类源文件#include ICamera.h ICamera::ICamera(std::string cameraName, std::string picDir) { name cameraName; commonFun(picDir); } std::string ICamera::getCameraName() { return name; } void ICamera::commonFun(std::string picDir) { //业务逻辑 }2.具体相机子类这里只举例一个厂家如果多个厂家写多个子类就行。头文件#ifndef _DSCAMERA_H_ #define _DSCAMERA_H_ #include ICamera.h #include DVPCamera.h class DSCamera : public ICamera { public: ~DSCamera() override { close(); } DSCamera(std::string cameraName, std::string simPicDir) : ICamera(cameraName, simPicDir) {} /** * brief 相机初始化 * return */ virtual void init(CameraManagePara cmPara) override; /** * brief 设置相机参数 * param para * return */ virtual bool setParameter(CameraThreadPara para) override; /** * brief 相机在线状态 * return */ virtual bool isOnline() override; /** * brief 句柄是否有效 * return */ virtual bool isValidHandle() override; /** * brief 关闭相机 */ virtual void close() override; /** * brief 关闭流 * param */ virtual void stopGrab() override; private: //bool isValidHandle(); void connect(CameraManagePara cmPara); //相机原生句柄 dvpHandle handle; }; #endif // !_DSCAMERA_H_源文件#include DSCamera.h dvpInt32 dSCameraCallBack(dvpHandle handle, dvpStreamEvent event, void* pContext, dvpFrame* pFrame, void* pBuffer) { DSCamera* pThis (DSCamera*)pContext; //基类通用变量 pThis-frameId pFrame-uFrameID; //回调取图 cv::Mat mat cv::Mat(pFrame-iHeight, pFrame-iWidth, CV_8UC3, (uchar*)pBuffer, pFrame-iWidth * 3).clone(); return 0; } void DSCamera::init(CameraManagePara cmPara) { connect(cmPara); } bool DSCamera::setParameter(CameraThreadPara para) { dvpStatus status; //关闭流 status dvpStop(handle); //设置相机参数等等 //开启流 status dvpStart(handle); return true; } bool DSCamera::isOnline() { if (!isValidHandle()) return false; dvpStatus status; bool online false; status dvpIsOnline(handle, online); if (status ! DVP_STATUS_OK) { LOG(ERROR) get online status error std::endl; return false; } return online; } void DSCamera::close() { //关闭视频流 dvpStatus status dvpStop(handle); //关闭相机 dvpStatus status1 dvpClose(handle); } bool DSCamera::isValidHandle() { bool isValid false; dvpStatus status dvpIsValid(handle, isValid); if (status ! DVP_STATUS_OK) { return false; } return isValid; } void DSCamera::stopGrab() { dvpStatus status dvpStop(handle); } void DSCamera::connect(CameraManagePara cmPara) { dvpStatus status; status dvpOpenByUserId(name.c_str(), OPEN_NORMAL, handle); //设置相机属性-略 //设置回调 status dvpRegisterStreamCallback(handle, dSCameraCallBack, STREAM_EVENT_FRAME_THREAD, this); }3.抽象工厂通过工厂来创建具体子类对象。#ifndef _ICAMERAFACTORY_H_ #define _ICAMERAFACTORY_H_ #include ICamera.h #include DSCamera.h #include DHCamera.h #include MDWSCamera.h class ICameraFactory { public: virtual ~ICameraFactory() default; // 创建对应厂商相机实例 virtual ICamera* createCamera(std::string cameraName, std::string picPath) 0; }; class DSCameraFactory : public ICameraFactory { public: ICamera* createCamera(std::string cameraName, std::string picPath) override { return new DSCamera(cameraName, picPath); } }; class DHCameraFactory : public ICameraFactory { public: ICamera* createCamera(std::string cameraName, std::string picPath) override { return new DHCamera(cameraName, picPath); } }; class MDWSCameraFactory : public ICameraFactory { public: ICamera* createCamera(std::string cameraName, std::string picPath) override { return new MDWSCamera(cameraName, picPath); } }; class CameraFactoryManager { public: // 根据相机类型创建相机实例 static ICamera* createCamera(const std::string camType, const std::string camName, const std::string picPath) { if (camType DS) { return DSCameraFactory{}.createCamera(camName, picPath); } else if (camType DH) { return DHCameraFactory{}.createCamera(camName, picPath); } else if (camType MDWS) { MDWSCameraFactory factory; return MDWSCameraFactory{}.createCamera(camName, picPath); } else { throw std::runtime_error(unsupported camera type: camType); } } }; #endif // !_ICAMERAFACTORY_H_

相关新闻

RabbitMQ核心架构与高可用实践指南

RabbitMQ核心架构与高可用实践指南

1. RabbitMQ核心定位与行业价值 RabbitMQ作为开源消息代理中间件的标杆产品,已经服务全球数百万开发者超过15年。我首次接触RabbitMQ是在2013年处理电商平台的订单异步化改造,当时面对每秒3000订单的洪峰冲击,传统同步处理方式导致数据库连接…

2026/7/23 9:43:41 阅读更多 →
NE2-S1W以太网模组TCP透传配置与工业物联网应用实战

NE2-S1W以太网模组TCP透传配置与工业物联网应用实战

在实际工业物联网和嵌入式开发项目中,经常需要将传统的串口设备接入以太网网络。亿佰特 NE2-S1W 以太网模组正是为解决这类需求而设计的贴片式串口转以太网模块,它能够实现 TTL 串口数据与以太网数据的双向透明传输。对于需要将 PLC、传感器、控制器等串…

2026/7/23 9:43:41 阅读更多 →
Etcd单机多实例部署与配置指南

Etcd单机多实例部署与配置指南

1. 项目背景与核心需求最近在部署一套分布式系统时,需要搭建高可用的键值存储服务。经过技术选型对比,最终选择了Etcd作为底层存储组件。考虑到生产环境对稳定性的要求,我们决定采用经过长期验证的v3.1.15版本,而非盲目追求最新版…

2026/7/23 9:43:40 阅读更多 →

最新新闻

10人SolidWorks研发团队共享一台云主机方案如何配置

10人SolidWorks研发团队共享一台云主机方案如何配置

针对 10 人三维研发团队,传统单人工作站模式普遍硬件投入高、算力闲置、图纸分散、协同低效等痛点。采用云飞云共享云桌面服务器方案,从硬件选型、网络搭建、平台部署、终端接入五大维度统筹规划,搭配性能优化、数据安全体系,一站…

2026/7/23 10:14:54 阅读更多 →
场景喂出来的数字人,谁做得更稳、更真、更活?

场景喂出来的数字人,谁做得更稳、更真、更活?

文/纪德编辑/子夜AI什么时候能真正“干活”?今年的世界人工智能大会(WAIC),给出了最直观的答案。大会现场,60台人形机器人第一次以“志愿者”的身份上岗,在展馆里跑导览、答问询。而在去年,它们…

2026/7/23 10:14:54 阅读更多 →
Castor:命令行DLNA投屏工具部署与自动化应用指南

Castor:命令行DLNA投屏工具部署与自动化应用指南

今天介绍一个实用的开源工具——Castor,它能让你直接从命令行终端向电视投屏任意网页视频。这个项目解决了传统投屏方案依赖特定App或平台限制的问题,让你在Linux、macOS或Windows终端中快速将在线视频推送到电视大屏上。Castor的核心优势在于轻量、跨平…

2026/7/23 10:14:54 阅读更多 →
Linux C语言网络编程:TCP校验和计算与Offload机制详解

Linux C语言网络编程:TCP校验和计算与Offload机制详解

1. 项目概述:一个被忽视的TCP校验和细节 最近在调试一个基于Linux的C语言网络服务时,遇到了一个相当诡异的问题。我的程序能够正常完成TCP三次握手,但在握手之后发送实际的应用数据时,Wireshark抓包却总是显示数据包的TCP校验和&a…

2026/7/23 10:14:54 阅读更多 →
C++ vector 实现原理与手写教程:从内存模型到移动语义优化

C++ vector 实现原理与手写教程:从内存模型到移动语义优化

1. 项目概述:为什么vector是C程序员的“瑞士军刀”?如果你写过C,尤其是写过需要动态管理数组的代码,那你一定绕不开std::vector。它可能是你从C语言数组转向C标准库时,第一个让你感到“真香”的容器。我刚开始学C那会儿…

2026/7/23 10:14:54 阅读更多 →
闲置Mac本地部署OpenClaw智能网关实战指南

闲置Mac本地部署OpenClaw智能网关实战指南

1. 项目概述:闲置Mac变身OpenClaw智能中枢 家里那台吃灰的Intel芯片MacBook Pro终于有了用武之地。最近在开发者社区热议的OpenClaw项目,本质上是一套开源的智能体开发框架,能够将普通电脑改造成支持自然语言交互的AI网关。不同于需要云端API…

2026/7/23 10:13:54 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻