0

0

C++享元模式与共享数据结合应用

P粉602998670

P粉602998670

发布时间:2025-09-16 08:49:01

|

275人浏览过

|

来源于php中文网

原创

享元模式通过共享内部状态减少内存开销,适用于文本编辑器字符格式等重复数据场景,使用工厂类和std::shared_ptr管理可共享的CharFormat对象,结合std::unordered_map实现高效查找与复用。

c++享元模式与共享数据结合应用

在C++中,享元模式(Flyweight Pattern)常用于减少大量相似对象带来的内存开销。当多个对象共享相同数据时,通过将“不变的内部状态”提取出来共享使用,可以显著提升性能和资源利用率。将享元模式与共享数据结合,尤其适用于需要频繁创建轻量级对象但包含重复信息的场景,比如文本编辑器中的字符格式、图形系统中的样式设置等。

享元模式核心思想

享元模式通过共享尽可能多的数据来支持大量细粒度对象的高效表示。它区分两种状态:

  • 内部状态(Intrinsic State):可共享,不随环境变化,通常作为参数传入方法中。
  • 外部状态(Extrinsic State):不可共享,依赖上下文,每次调用时由客户端传入。

例如,在绘制大量相似图形时,颜色、线型等可作为内部状态共享;而位置、大小等则作为外部状态传递。

结合共享数据实现方式

在C++中,常用工厂类 + 智能指针 + std::map结构管理共享的享元对象。典型做法是使用std::shared_ptr管理共享数据,确保生命周期安全,同时避免重复创建。

立即学习C++免费学习笔记(深入)”;

示例:文本编辑器中字符格式的共享

方维购物分享系统
方维购物分享系统

方维购物分享系统是一个专业的时尚分享和互联网技术的深度结合,一个充满想象力的蓝海市场。为您搭建一个web2.0时代崭新的社会化电子商务模式。在这里与好友一起发现美丽,搜索流行,分享快乐! 社会化电子商务电子商务结合社会化媒体的社会化特性(分享、点评、评论)和社交图谱(用户的社会化关系)而形成的一种新型电子商务服务。 全新的商业模式社会化+电子商务合二为一,全新的内容发布平台和交互应用模式。用户可

下载
// 字符格式(内部状态)
struct CharFormat {
    std::string font;
    int size;
    bool bold;
    bool italic;

    // 支持比较,便于查找
    bool operator==(const CharFormat& other) const {
        return font == other.font && size == other.size &&
               bold == other.bold && italic == other.italic;
    }
};

// 哈希函数,用于unordered_map
struct FormatHash {
    size_t operator()(const CharFormat& fmt) const {
        return std::hash()(fmt.font) ^
                (fmt.size << 4) ^
                (fmt.bold << 8) ^
                (fmt.italic << 9);
    }
};

// 享元工厂
class FormatFlyweightFactory {
private:
    std::unordered_map, FormatHash> pool;

public:
    std::shared_ptr getFormat(const CharFormat& key) {
        auto it = pool.find(key);
        if (it != pool.end()) {
            return it->second;
        }
        auto newFmt = std::make_shared(key);
        pool[key] = newFmt;
        return newFmt;
    }
};

每个字符不再保存完整的格式信息,而是持有对

CharFormat
的共享引用,大量相同格式的字符共用同一份数据。

应用场景与优势

这种模式特别适合以下情况:

  • 程序需创建大量对象,且其中许多具有相同属性。
  • 内存占用成为瓶颈,对象内部状态可被有效共享。
  • 对象行为独立于其所处上下文,外部状态可动态传入。

优势包括:

  • 大幅降低内存消耗。
  • 提高对象创建效率,避免重复初始化。
  • 借助智能指针自动管理共享资源生命周期。

基本上就这些。享元模式与共享数据结合的关键在于识别可共享的部分,并设计好工厂机制来统一管理实例。C++中配合

std::shared_ptr
和哈希容器,实现简洁高效,适合性能敏感的应用场景。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

59

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

38

2025.11.27

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

3

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

41

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

101

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

148

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

57

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号