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

享元模式(Flyweight)在 C++ 中主要用于减少内存占用,通过共享大量细粒度对象来提升性能,特别适用于对象数量庞大、状态可分“内在”与“外在”的场景(比如文字编辑器中的字符、游戏中的子弹、GUI 中的图标等)。
内在状态(Intrinsic State)是共享的、不可变的,属于享元对象自身,比如字符的字体、大小、颜色(若统一);
外在状态(Extrinsic State)是不共享的、变化的,由客户端维护并传入,比如字符在文档中的位置、行号、是否选中等。
关键不是“把对象变少”,而是“避免重复创建相同内在状态的对象”。
用 std::map 或 std::unordered_map 缓存已创建的享元实例,按内在状态作 key 查找复用:
示例关键片段:
Figma
Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。
1371
查看详情
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:
& 提高性能(但需确保工厂生命周期长于使用者)享元不是银弹,滥用反而降低可读性和性能:
基本上就这些。享元本质是空间换时间 + 状态解耦,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小时内与您取得联系。