全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

c++如何实现一个享元模式_c++结构型设计模式Flyweight【性能优化】

享元模式通过共享内在状态、分离外在状态来减少内存占用;核心是用工厂缓存并复用相同内在状态的对象,客户端传入外在状态调用行为。

c++如何实现一个享元模式_c++结构型设计模式flyweight【性能优化】

享元模式(Flyweight)在 C++ 中主要用于减少内存占用,通过共享大量细粒度对象来提升性能,特别适用于对象数量庞大、状态可分“内在”与“外在”的场景(比如文字编辑器中的字符、游戏中的子弹、GUI 中的图标等)。

核心思想:分离内在状态与外在状态

内在状态(Intrinsic State)是共享的、不可变的,属于享元对象自身,比如字符的字体、大小、颜色(若统一);
外在状态(Extrinsic State)是不共享的、变化的,由客户端维护并传入,比如字符在文档中的位置、行号、是否选中等。

关键不是“把对象变少”,而是“避免重复创建相同内在状态的对象”。

手动实现享元工厂(推荐初学理解)

std::mapstd::unordered_map 缓存已创建的享元实例,按内在状态作 key 查找复用:

  • 定义享元基类(接口或抽象类),声明操作函数,参数接收外在状态
  • 派生具体享元类,只保存内在状态(const 成员),实现逻辑
  • 实现享元工厂类,负责创建/获取享元,内部用 map 管理生命周期(注意线程安全需加锁)
  • 客户端不再 new 具体类,而是调用工厂 getFlyweight(intrinsicKey),再传 extrinsic 参数调用其方法

示例关键片段:

Figma Figma

Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

Figma 1371 查看详情 Figma
class CharacterFlyweight {
public:
    virtual void render(int x, int y) const = 0; // 外在状态:坐标
    virtual ~CharacterFlyweight() = default;
};

class ConcreteChar : public CharacterFlyweight {
    const char ch_;
    const std::string font_;
    const int size_;
public:
    ConcreteChar(char c, std::string f, int s) 
        : ch_(c), font_(std::move(f)), size_(s) {}
    
    void render(int x, int y) const override {
        std::cout << "Draw '" << ch_ << "' at (" << x << "," << y << ") "
                  << "with " << font_ << " " << size_ << "pt\n";
    }
};

class FlyweightFactory {
    std::unordered_map<std::string, std::unique_ptr<CharacterFlyweight>> pool;
public:
    CharacterFlyweight& getFlyweight(const std::string& key) {
        auto it = pool.find(key);
        if (it != pool.end()) return *it->second;
        
        // 解析 key(如 "A|Arial|12")→ 构造对象
        auto pos1 = key.find('|'), pos2 = key.find('|', pos1+1);
        char c = key[0];
        std::string font = key.substr(pos1+1, pos2-pos1-1);
        int size = std::stoi(key.substr(pos2+1));
        
        pool[key] = std::make_unique<ConcreteChar>(c, font, size);
        return *pool[key];
    }
};

使用智能指针 + 工厂封装(更现代、安全)

避免裸指针和手动管理,用 std::shared_ptr 管理享元生命周期,工厂返回 const 引用或 shared_ptr:

  • 享元类建议设计为轻量、无状态修改(所有成员 const 或 immutable)
  • 工厂内部用 static 局部变量 + unordered_map 实现单例式缓存,天然线程安全(C++11 起)
  • 客户端拿到的是共享指针,无需关心释放;也可返回 const CharacterFlyweight& 提高性能(但需确保工厂生命周期长于使用者)

什么时候不该用享元?

享元不是银弹,滥用反而降低可读性和性能:

  • 对象总数很少(
  • 内在状态组合爆炸(比如 10 种字体 × 5 种大小 × 20 种颜色 → 1000 种 key),缓存反而吃内存
  • 外在状态传递复杂,导致接口臃肿、调用频繁出错
  • 对象本身已很轻量(如仅含一个 int),共享意义不大

基本上就这些。享元本质是空间换时间 + 状态解耦,C++ 实现关键在于明确区分内外状态、合理设计 key、用好容器和智能指针。不复杂但容易忽略外在状态的归属和线程安全性。

以上就是c++++如何实现一个享元模式_c++结构型设计模式Flyweight【性能优化】的详细内容,更多请关注其它相关文章!


# 什么时候  # 靖江网站优化靠谱吗  # 安达网站建设网络推广  # SEO研究生书包推荐  # seo平台皆选6火星  # 桥西区网站制作方法优化  # 南通标题优化seo  # 海口关键词排名优化费用  # 建设部网站分享歌单  # 女团推广视频素材网站  # 拉萨拼多多seo  # 适用于  # c++  # 头文件  # 的是  # 复用  # 尼克  # 行号  # 如何实现  # 客户端  # 如何使用  # red  # 内存占用  # 享元模式 


相关文章: CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  红果短剧网页版官网入口 官方最新网址发布  Android Studio计算器C键功能异常排查与修复教程  深入理解J*a编译器的兼容性选项:从-source到--release  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  星露谷物语官网入口 星露谷物语游戏官网入口  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  在React函数组件中利用原生HTML5进行邮箱地址验证  J*aScript中localStorage数据的获取、清洗与格式化教程  可靠CSGO开箱平台解析 CSGO开箱网合集  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  Go Martini框架:动态服务解码后的图片内容  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  微信语音通话掉线如何解决 微信语音通话稳定优化方法  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  微信网页版官方快速登录入口 微信网页版网页版账号直达  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  顺丰国际快递查询 国际件官方查询入口  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  J*a初级项目如何接入API数据_第三方接口请求与响应解析  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  Python多版本共存与虚拟环境管理深度指南  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  c++如何实现单例设计模式_c++线程安全的单例模式写法  mcjs网页版在线存档 mcjs云存档登录入口  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  Lar*el Eloquent:基于关联关系是否存在进行父模型过滤与删除  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  谷歌google账号怎么注册账号 谷歌账号注册官方流程  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  Golang如何使用context实现超时取消_Golang context超时取消模式实践  《噬血代码2》新预告片发布 展示游戏剧情  照顾宝贝2小游戏免费秒玩入口  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。