当前位置: 首页 > news >正文

服务器不能访问网站一起做网站

服务器不能访问网站,一起做网站,各位大神给个网址,杭州网站建设技术工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下: 考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过…

工厂方法模式的瑕疵

前一篇笔记中我们介绍了工厂方法模式,示例的类图如下:

考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过程中,就需要加以判断。

例如,在我的例子中,要根据连接到主机的相机来实例化相机对象,那么客户端(使用工厂方法创建实例的一方)使用工厂方法模式创建对象的时候,代码可能是这样:

//运行时确定数组大小,且确定后不可改变
auto camera_devices_ = std::make_unique<std::shared_ptr<CameraDevice>[]>(onlined_camera_num_);for(int i = 0; i < onlined_camera_num_; ++i)
{std::shared_ptr<CameraDeviceFactory> factory;if("Sick" == camera_name[i])    //camera_name[i]中元素是提前获取的与连接的相机对应的供应商名称factory = std::make_shared<SickCameraFactory>();else if("Basler" == camera_name[i])factory = std::make_shared<BaslerCameraFactory>();else if("Huaray" == camera_name[i])factory = std::make_shared<HuarayCameraFactory>();camera_devices_[i] = factory->CreateCamera();
}

虽然工厂方法模式遵循了开闭原则,即当有新类型的时候,无需修改现有的代码,只需新加产品类和对应工厂类即可。但是对于客户端来说,当需要实例化的类型数量增加时,就需要新增else if去适配,这使得客户端代码变得冗长且难以维护。

注册表

为了解决上面问题,我们可以实现一个类型的注册表,允许动态创建对象。这种方法通过将关键字映射到构造函数指针,使得可以根据字符串名称动态地实例化对象。

#ifndef Reflection_H
#define Reflection_H#include <map>
#include <string>template <typename T, typename... ArgType>
void* CreateInstance(ArgType... args)
{return new T(args...);
}//需要反射的类使用该宏注册
#ifndef ReflectRegister
#define ReflectRegister(identifier, class_name, ...) \static bool __type##class_name = Object::Register(identifier, (void*)CreateInstance<class_name, ##__VA_ARGS__>);
#endifclass Object
{
public:template <typename BaseClass, typename... ArgType>static BaseClass *CreateObject(const std::string &vendor_name, ArgType... args){using CreateFactory = BaseClass *(*)(ArgType...);auto& class_map = GetStaticFuncMap();auto iter = class_map.find(vendor_name);if (iter == class_map.end()){CRRC_ERROR("class_name not found in map");return nullptr;}else{CRRC_DEBUG("class_name found in map");return reinterpret_cast<CreateFactory>(class_map[vendor_name])(args...);}} //向map中注册关键字和类的构造函数static bool Register(const std::string &vendor_name, void *ctor_ptr){CRRC_DEBUG("Register class_name:"<<vendor_name);GetStaticFuncMap()[vendor_name] = ctor_ptr;return true;}private://获取全局唯一的map//map记录了关键字和类的构造函数的映射关系static std::map<std::string, void*>& GetStaticFuncMap(){static std::map<std::string, void*> class_map_;return class_map_;}};#endif //Reflection_H

在具体相机工厂中,我们可以使用ReflectRegister注册此类(以Basler相机为例,其余类似):

class BaslerCameraDeviceFactory : public CameraDeviceFactory
{
public:std::shared_ptr<CameraDevice> CreateCameraDevice() override{return std::make_shared<BaslerCameraDevice>();}
};ReflectRegister("Basler", BaslerCameraDeviceFactory);

好了,现在回头再看客户端使用工厂方法模式创建对象的代码,就可以简化为:

//运行时确定数组大小,且确定后不可改变
auto camera_devices_ = std::make_unique<std::shared_ptr<CameraDevice>[]>(onlined_camera_num_);for(int i = 0; i < onlined_camera_num_; ++i)
{auto p_factory = Object::CreateObject<CameraDeviceFactory>(camera_name[i]);//camera_name[i]中元素是提前获取的与连接的相机对应的供应商名称if (!p_factory)continue;elsecamera_devices_[i] = p_factory->CreateCameraDevice();delete p_factory;
}

文章转载自:paw5zx

原文链接:https://www.cnblogs.com/paw5zx/p/18229334

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

http://www.yayakq.cn/news/525851/

相关文章:

  • 连锁店网站建设银川网站建设公司
  • 做app简单还是网站建设一个网站需要多少费用
  • 中国物流网站文化传播公司网站模版
  • 无人机公司网站建设网页模板大全
  • 大连网站建设辽icp备大学生求职创业补贴有多少钱
  • 苏州做企业网站的公司企业建立站点方案有几种
  • 微信微网站开发报价网页设计心得体会免费
  • wordpress百度分享深圳网站设计专家乐云seo品牌
  • 电子商务网站建设的一般步骤有网站的建设教程
  • 网站建设没业务wordpress建站腾讯云
  • 特效很好的网站陕西网站制作商
  • 培训网站建设的背景山东聊城建设学校贴吧
  • 康定网站建设工作室淄博专业网站建设
  • 做网站营业执照经营范围怎么填写网页设计与网站建设报告书
  • 漂亮的设计类图片网站永嘉网站优化
  • 哪个网站可以做练习题网站换新域名
  • 学校网站的常规化建设学校网站建设情况报告
  • 什么软件做网站好属于网页制作工具
  • 杨凌企业网站建设根据网站集约化建设的要求
  • 网站后台如何添加新闻免费推广网站2022
  • 儿童教育网站怎么做有趣艺术家网站源码
  • 网站建设教案视频 wordpress
  • 滕州外贸网站建设wordpress怎么删除文章发布时间
  • 企业网站模板下载网站安全检测工具
  • 网站英文版怎么做小程序开发兼职的小知识点
  • 北京网站建设方案策划h5网页是什么意思
  • 还有河北城乡和住房建设厅网站吗用vs2008做的网站前台脚本是什么
  • 市体育局网站 两学一做精准营销模式
  • 做投资要关注哪些网站网易企业邮箱怎么撤回已发送邮件
  • 河南省建设人才信息网站广告联盟全自动赚钱系统