news 2026/9/3 2:23:08

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/9/2 10:09:55

55、Linux系统管理与基础网络配置指南

Linux系统管理与基础网络配置指南 1. Linux系统管理知识问答 1.1 用户与组管理 合法用户名 :Linux用户名必须少于32个字符且以字母开头,可包含字母、数字和特定符号。例如,“larrythemoose”和“PamJones”是合法的,而“4sale”以数字开头不合法,“Samuel_Bernard_Del…

作者头像 李华
网站建设 2026/9/2 11:45:43

linux_projetc_1

一.简答题&#xff08;共10 题,100.0分&#xff09; 1. 1、添加 cs1 和 cs2 两个普通用户 Plain Text useradd cs1 useradd cs2 答案&#xff1a; 答案解析&#xff1a; 难度&#xff1a;0.8 (易) 知识点&#xff1a; 2. 2、修改两个账户的用户标识符 UID 为 600 和 601 Plain …

作者头像 李华
网站建设 2026/9/2 20:19:14

Vencord如何解决ModView权限限制?一个简单设置让你全服务器通用

Vencord如何解决ModView权限限制&#xff1f;一个简单设置让你全服务器通用 【免费下载链接】Vencord The cutest Discord client mod 项目地址: https://gitcode.com/GitHub_Trending/ve/Vencord 还在为Discord的ModView功能受限于管理员权限而烦恼吗&#xff1f;Venco…

作者头像 李华
网站建设 2026/9/2 17:26:21

RocketMQ 命名服务器(NameServer):路由注册、负载均衡与高可用机制

在分布式消息中间件领域&#xff0c;RocketMQ以其高吞吐、低延迟、高可靠的特性被广泛应用于各类业务场景。而支撑起这些特性的核心组件之一&#xff0c;便是命名服务器&#xff08;NameServer&#xff09;。它如同RocketMQ生态中的“导航灯塔”&#xff0c;负责维护整个集群的…

作者头像 李华
网站建设 2026/9/3 0:23:05

Bananas:5分钟掌握跨平台屏幕共享的高效协作技巧

Bananas&#xff1a;5分钟掌握跨平台屏幕共享的高效协作技巧 【免费下载链接】bananas Bananas&#x1f34c;, Cross-Platform screen &#x1f5a5;️ sharing &#x1f4e1; made simple ⚡. 项目地址: https://gitcode.com/gh_mirrors/ba/bananas 在远程协作和在线教…

作者头像 李华