c++如何实现一个享元设计模式_c++ Flyweight模式节约内存


享元模式通过共享内部状态减少内存使用,如示例中多棵树共享相同TreeType实例,仅外部位置不同,从而在大量相似对象场景下显著降低内存开销。

c++如何实现一个享元设计模式_c++ flyweight模式节约内存

在C++中,享元(Flyweight)模式是一种用于减少内存使用的设计模式,特别适用于大量相似对象的场景。它的核心思想是共享尽可能多的相同数据,把不变的部分提取为“内部状态”,而将变化的部分作为“外部状态”传入,避免重复创建对象。

享元模式的核心结构

享元模式通常包含以下几个部分:

  • Flyweight(抽象享元类):定义接口,描述操作外部状态的方法。
  • ConcreteFlyweight(具体享元类):实现Flyweight接口,并存储内部状态(可共享)。
  • UnsharedConcreteFlyweight(非共享具体享元):某些情况下不需要共享的对象,可选。
  • FlyweightFactory(享元工厂):负责管理享元对象,通过键值缓存已创建的实例,避免重复创建。

一个实际的C++实现示例

假设我们要绘制森林中的树,每棵树有种类(type)、颜色、高度等属性。其中“种类”和“颜色”是固定的,可以共享;而“位置(x, y)”是变化的,应作为外部状态传入。

#include <iostream>
#include <string>
#include <map>
#include <memory>
<p>// 抽象享元类
class TreeType {
public:
std::string type;
std::string color;</p><pre class='brush:php;toolbar:false;'>TreeType(const std::string& t, const std::string& c) : type(t), color(c) {}

void draw(int x, int y) const {
    std::cout << "Drawing " << color << " " << type 
              << " at (" << x << ", " << y << ")\n";
}

};

Type Studio Type Studio

一个视频编辑器,提供自动转录、自动生成字幕、视频翻译等功能

Type Studio 61 查看详情 Type Studio

// 享元工厂 class TreeFactory { private: static std::map<:string std::shared_ptr>> pool;

// 生成唯一键
static std::string getKey(const std::string& type, const std::string& color) {
    return type + "_" + color;
}

public: static std::shared_ptr getTreeType(const std::string& type, const std::string& color) { std::string key = getKey(type, color); if (pool.find(key) == pool.end()) { pool[key] = std::make_shared(type, color); std::cout

// 静态成员初始化 std::map<:string std::shared_ptr>> TreeFactory::pool;

// 外层封装类:代表一棵树 class Tree { private: int x, y; std::shared_ptr type;

public: Tree(int x, int y, const std::shared_ptr& type) : x(x), y(y), type(type) {}

void draw() const {
    type->draw(x, y);
}

};

// 森林类,包含多棵树 class Forest { private: std::vector trees;

public: void plantTree(int x, int y, const std::string& type, const std::string& color) { auto treeType = TreeFactory::getTreeType(type, color); trees.emplace_back(x, y, treeType); }

void draw() const {
    for (const auto& tree : trees) {
        tree.draw();
    }
}

};

使用示例:

int main() {
    Forest forest;
    forest.plantTree(1, 2, "Oak", "Green");
    forest.plantTree(3, 4, "Oak", "Green");  // 共享同一个 TreeType
    forest.plantTree(5, 6, "Pine", "DarkGreen");
<pre class='brush:php;toolbar:false;'>forest.draw();

return 0;

}

为什么能节约内存?

在这个例子中,即使我们创建了上百棵“Oak - Green”类型的树,也只会有一个 TreeType 实例被创建并共享。所有树对象共用这个实例,只保存自己的位置信息。这样大大减少了内存开销,尤其适合大规模相似对象的场景,比如图形系统、文本编辑器中的字符格式、游戏中的粒子效果等。

注意事项与适用场景

  • 享元适合对象数量巨大且内部状态高度重复的情况。
  • 外部状态必须由客户端传入,不能放在享元对象内部。
  • 线程安全需额外处理,若多线程访问享元工厂,应加锁保护缓存map。
  • 过度使用可能增加代码复杂度,应权衡是否真的需要节省内存。

基本上就这些。通过共享不变状态,Flyweight模式有效降低了内存占用,是性能优化中的实用技巧之一。不复杂但容易忽略。

以上就是c++++如何实现一个享元设计模式_c++ Flyweight模式节约内存的详细内容,更多请关注其它相关文章!


# 边缘  # 清远网站建设银行暑期  # seo专业教材  # 黄山关键词排名查询工具  # 株洲网站建设立项  # 上饶低价网站建设  # seo搜索推广原理  # 惠州网站建设比较好  # 钱塘区抖音seo公司  # 虹口营销推广招商网站  # 河北省网站建设行情  # 放在  # 是一种  # 几个  # ai  # 自己的  # 游戏开发  # 何为  # 棵树  # 如何实现  # 多线程  # red  # 为什么  # 内存占用  # stream  # win  # ios  # c++ 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《procreate》绘制渐变效果教程  为什么XML解析器对大小写敏感? 理解XML规范中的大小写规则与最佳实践  金牛福袋获取攻略  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  PHP安全加载非公开目录图片与动态内容类型处理指南  响应式设计中动态背景颜色条的实现指南  ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  Go语言中方法接收器的选择:值类型还是指针类型?  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  餐馆菜篮选购指南  VS Code中的Tailwind CSS IntelliSense插件使用技巧  如何在mysql中使用索引提示_mysql索引提示优化方法  睡觉时心跳快是什么原因 夜间心悸如何应对  B站怎么快速升级 B站用户等级提升攻略【详解】  《via浏览器》强制缩放网页设置方法  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  《大周列国志》皇帝律令功能介绍  b站怎么用微信登录_b站微信登录方法  《万兴喵影》导出视频方法  小红书如何引流到私信?引流到私信有用吗?  《星露谷物语》克林特好感度事件介绍  从J*a应用程序中导出MySQL表数据的技术指南  《猎聘》筛选猎头岗位方法  PySimpleGUI中实现键盘按键与按钮事件绑定教程  海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接  美发店速赢秘籍  Vue 3中独立响应式实例的创建与应用  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  《美篇》取消会员自动续费方法  《海贝音乐》均衡器设置方法  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  哔哩哔哩在线观看入口 B站官网免费进入  申通快递查询 申通物流快递单实时查询入口  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  Django模型动态关联检查:高效管理复杂关系  邦丰播放器频道搜索设置  性能与资源监视器快捷打开  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  《雅迪智行》用手机开锁方法  如何在Golang中处理表单文件上传_Golang 表单文件上传示例  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  mysql中如何配置字符集和排序规则_mysql字符集排序配置  追剧达人如何发弹幕  《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略  抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明 

 2025-12-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.