news 2026/2/5 8:19:02

Boost与设计模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Boost与设计模式

创建型模式

面向对象的软件开发的基础是对象。随着系统的不断演化,会出现越来越多的对象,如果单纯使用C++提供的new操作符,将使程序中到处都是硬编码的对象创建代码,很难适应变,化。而创建型模式抽象了类的实例化过程,它封装了对象的创建动作,使对象的创建可以独立.于系统的其他部分。

抽象工厂(Abstract Factory)

抽象工厂模式把对象的创建封装在一个类中,这个类唯一的任务就是按需生产各种对象,通过派生子类的方式抽象工厂可以生产不同系列的、整套的对象。工厂类通常是单件,以保证,在系统的任何地方都可以访问,其中的每个方法都是工厂方法。在较小的软件系统中,抽象工,厂有时候会退化成一个没有子类的简单工厂。

xpressive库有一个抽象工厂regex_compiler,可以生产各种正则表达式解析对象,但它用模板技术而不是继承实例化出了具体的工厂。

生成器(Builder)

生成器模式分解了复杂对象的创建过程,创建过程可以被子类改变,使同样的过程可以生产出不同的对象。生成器与抽象工厂不同,它不是一次性地创建出产品,而是分步骤逐渐地“装配”出对象,因而可以对创建过程进行更精细的控制。

Boost库没有生成器模式的具体应用,因为生成器模式主要用来构造复杂的对象,对于库来说复杂的创建过程会令库难以使用。

multi_array对象的创建过程类似生成器模式,它先用模板参数设定基本维数,然后再逐个指定各个维度,最后生成一个多维数组。

工厂方法(Factory Method)

工厂方法模式是另一种生产对象的方式,它把对象的创建封装在一个方法中,子类可以改变工厂方法的生产行为生产不同的对象。工厂方法所属的类不一定是工厂类(抽象工厂或者生成器),它可能是一个普通类、一个框架类,或者是一个自由函数。

Boost 库中的 make_shared () 、make_optional() 、make_tuple ()、regex<>:: complie ()等函数都属于工厂方法模式。而functional/factory组件则实现了对new操作符的完全封装,类似于泛化的make_pair ()、 make_optional()。

原型(Prototype)

原型模式使用类的实例通过拷贝的方式创建对象,具体的拷贝行为可以定制,它最常见的用法是为类实现一个clone()成员函数,这个函数创建,个与原型相同或相似的新对象。

weak_ptr的enable_shared _rom_this用法类似于一个原型模式,它创建了一个指向自身的shared_ptr, exception库提供了一个enable_current_exception()函数,它被用于线程安全地处理异常,返回一个clone的异常对象。

指针容器库pointer_container容纳的指针不允许共享,如果要拷贝指针容器,则需要被容纳的元素提供clone()操作,使用原型模式创建一个等价的副本。

单件(Singleton)

单件模式保证类有且仅有一个实例,并且提供一个全局的访问点。通常的全局变量技术虽,然也可以提供类似的功能,但它不能防止用户创建多个实例。单件的基本原理很简单,但有很,多实现的变化。

Boost库目前没有专门的单件库,但在serialization库提供了一个可用的实现。

结构型模式

结构型模式专注于如何组合类或对象,进而形成更大更有用的新对象。

组合对象有两种方式:第一种是C++语言本身提供的继承机制,但它在编译期就已经确定,了对象的关系,无法在运行时改变,缺乏足够的灵活性。第二种方法是运行时对象组合,不同的对象之间彼此互相独立,仅通过定义良好的接口通信协同工作,它更灵活和易于模块化,但因为组合方式富有变化而较难以理解。

适配器(Adapter)

适配器模式把一个类的接口转换(适配)为另一个接口,从而在不改变原有代码的基础上,复用原代码。它的别名wrapper更清晰地说明了它的实现结构:包装了原有对象,再给出一个新的接口。

array类是适配器模式的一个很好例子,它把原始数组适配成了符合STL标准的容器,
使数组可以与其他

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/4 21:30:45

Boost C++11多线程

https://www.boost.org/doc/libs/1_55_0/doc/html/thread.html thread 当创建一个thread对象后,线程就立刻开始执行。 join()和timed_join()方法等待线程结束。 join()一直阻塞等待,直到线程结束。 timed_join()阻塞等待线程结束,或阻塞等待一定的时间段,然后不管线程是否…

作者头像 李华
网站建设 2026/2/4 18:03:36

vue基于Spring Boot的校园饮品销售平台的 奶茶点餐5tq4h11m

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/1/29 15:08:23

实战指南:用libuvc跨平台USB视频控制解决三大开发痛点

实战指南&#xff1a;用libuvc跨平台USB视频控制解决三大开发痛点 【免费下载链接】libuvc a cross-platform library for USB video devices 项目地址: https://gitcode.com/gh_mirrors/li/libuvc "为什么我的摄像头在Windows上能用&#xff0c;到了Linux就不行&a…

作者头像 李华
网站建设 2026/1/29 13:39:51

Yolo_Label:免费的终极YOLO图像标注神器

Yolo_Label&#xff1a;免费的终极YOLO图像标注神器 【免费下载链接】Yolo_Label GUI for marking bounded boxes of objects in images for training neural network YOLO 项目地址: https://gitcode.com/gh_mirrors/yo/Yolo_Label 在计算机视觉和深度学习领域&#xf…

作者头像 李华
网站建设 2026/1/29 13:34:48

HTML表单元素大全:从input到output的完整指南

HTML表单元素大全&#xff1a;从input到output的完整指南 HTML表单是构建交互式网页的核心组件&#xff0c;它允许用户输入数据并通过服务器端或客户端脚本处理这些信息。从基础的文本输入到复杂的日期选择器&#xff0c;HTML5规范定义了丰富的表单元素类型。本文将系统梳理HTM…

作者头像 李华
网站建设 2026/1/29 13:34:57

RocketMQ 存储模型深度剖析:CommitLog、ConsumeQueue 与索引文件设计

在分布式消息中间件领域&#xff0c;RocketMQ 以其高吞吐、低延迟、高可靠的特性占据重要地位&#xff0c;而这一切都离不开其底层精巧的存储模型设计。RocketMQ 的存储核心围绕 CommitLog、ConsumeQueue、索引文件 三大组件展开&#xff0c;三者各司其职又紧密协同&#xff0c…

作者头像 李华