首页 > 后端开发 > C++ > 正文

C++如何实现享元模式管理大量对象

P粉602998670
发布: 2025-09-18 13:11:02
原创
1018人浏览过
享元模式通过共享内部状态减少内存占用,C++中用工厂类结合静态map缓存实例。内部状态(如字符样式)共享存储,外部状态(如位置坐标)运行时传入,实现大量相似对象的高效管理。

c++如何实现享元模式管理大量对象

当需要创建大量相似对象时,直接实例化会消耗大量内存。享元模式通过共享相同状态的对象来减少内存占用,C++中可通过工厂类结合静态存储实现。

享元模式核心思想

将对象的状态分为内部状态和外部状态:

• 内部状态:可共享,通常作为享元对象的成员变量,不会随环境改变
• 外部状态:不可共享,由客户端在运行时传入,决定对象的行为表现

例如文本编辑器中的字符样式(字体、大小、颜色)是内部状态,位置坐标是外部状态。

基本结构实现

定义享元接口,通常包含一个操作方法接收外部状态:

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

北极象沉浸式AI翻译
北极象沉浸式AI翻译

免费的北极象沉浸式AI翻译 - 带您走进沉浸式AI的双语对照体验

北极象沉浸式AI翻译 0
查看详情 北极象沉浸式AI翻译
```cpp class CharacterFlyweight { public: virtual ~CharacterFlyweight() = default; virtual void display(int x, int y) const = 0; // x,y为外部状态 }; ```

具体享元类存储内部状态,构造时初始化:

```cpp class ConcreteCharacter : public CharacterFlyweight { private: char symbol; std::string font; int size;

public: ConcreteCharacter(char s, const std::string& f, int sz) : symbol(s), font(f), size(sz) {}

void display(int x, int y) const override {
    std::cout << "Draw '" << symbol << "' at (" << x << "," << y 
              << ") with font=" << font << ", size=" << size << "\n";
}
登录后复制

};

<H3>享元工厂管理实例</H3>
<p>使用静态map缓存已创建的享元对象,避免重复生成:</p>
```cpp
class FlyweightFactory {
private:
    static std::map<std::string, std::shared_ptr<CharacterFlyweight>> pool;

public:
    static std::shared_ptr<CharacterFlyweight> getCharacter(
        char symbol, const std::string& font, int size) {

        std::string key = std::string(1, symbol) + "_" + font + "_" + std::to_string(size);

        if (pool.find(key) == pool.end()) {
            pool[key] = std::make_shared<ConcreteCharacter>(symbol, font, size);
        }

        return pool[key];
    }
};

// 静态成员定义
std::map<std::string, std::shared_ptr<CharacterFlyweight>> FlyweightFactory::pool;
登录后复制

使用示例与效果

客户端通过工厂获取享元对象,传入外部状态调用行为:

```cpp int main() { auto ch1 = FlyweightFactory::getCharacter('A', "Arial", 12); auto ch2 = FlyweightFactory::getCharacter('A', "Arial", 12); // 共享同一实例 auto ch3 = FlyweightFactory::getCharacter('B', "Arial", 12);
ch1->display(0, 0);   // 外部状态不同
ch2->display(10, 0);  // 但共享内部状态
ch3->display(20, 0);

return 0;
登录后复制

}

<p>输出显示虽然创建了三个逻辑字符,但'A'只有一份内部数据,节省了存储空间。</p>

<p>基本上就这些。关键在于分离变与不变的部分,用工厂控制实例唯一性,适合处理重复度高的细粒度对象。</p>
登录后复制

以上就是C++如何实现享元模式管理大量对象的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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