全网整合营销服务商

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

免费咨询热线:400-708-3566

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

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

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

享元模式的核心结构

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

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

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

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

#include 
#include 
#include 
#include 

// 抽象享元类 class TreeType { public: std::string type; std::string color;

TreeType(const std::string& t, const std::string& c) : type(t), color(c) {}

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

};

// 享元工厂 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-youjiankuohaophpcndraw(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");
forest.draw();

return 0;

}

为什么能节约内存?

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

注意事项与适用场景

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

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


# ai  # c++  # ios  # win  # stream  # 内存占用  # 为什么  # red  # Static  # String  # if  # 封装  # const  # auto  # int  # void  # 接口  # class  # public  # private  # 线程  # 多线程  # map  # 对象  # 性能优化  # 棵树  # 自己的  # 几个  # 是一种  # 放在  # 在这个  # 不需要  # 而在  # 适用于  # 只会 


相关文章: 历史网站制作软件,华为如何找回被删除的网站?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  香港服务器租用每月最低只需15元?  如何快速建站并高效导出源代码?  如何在橙子建站中快速调整背景颜色?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  表情包在线制作网站免费,表情包怎么弄?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  大同网页,大同瑞慈医院官网?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作旅游网站html,怎样注册旅游网站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  临沂网站制作公司有哪些,临沂第四中学官网?  如何快速搭建个人网站并优化SEO?  建站之星伪静态规则如何设置?  建站之星如何快速生成多端适配网站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  大连 网站制作,大连天途有线官网?  建站之星Pro快速搭建教程:模板选择与功能配置指南  网站好制作吗知乎,网站开发好学吗?有什么技巧?  油猴 教程,油猴搜脚本为什么会网页无法显示?  C#怎么创建控制台应用 C# Console App项目创建方法  如何选择CMS系统实现快速建站与SEO优化?  如何正确选择百度移动适配建站域名?  如何制作算命网站,怎么注册算命网站?  如何零成本快速生成个人自助网站?  如何在服务器上三步完成建站并提升流量?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  微信小程序 input输入框控件详解及实例(多种示例)  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  简单实现Android文件上传  如何基于PHP生成高效IDC网络公司建站源码?  小建面朝正北,A点实际方位是否存在偏差?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何通过IIS搭建网站并配置访问权限?  如何做静态网页,sublimetext3.0制作静态网页?  如何快速生成ASP一键建站模板并优化安全性?  已有域名如何快速搭建专属网站?  宁波自助建站系统如何快速打造专业企业网站?  学校为何禁止电信移动建设网站?  linux top下的 minerd 木马清除方法  如何实现建站之星域名转发设置?  公众号网站制作网页,微信公众号怎么制作?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  攀枝花网站建设,攀枝花营业执照网上怎么年审? 

您的项目需求

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