跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 享元模式
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C++享元模式}} {{编程概念导航|C++设计模式}} == 概述 == '''享元模式'''(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象减少内存使用,特别适用于存在大量相似对象的场景。其核心思想是将对象的'''内在状态'''(可共享部分)与'''外在状态'''(不可共享部分)分离,通过共享内在状态来优化资源消耗。 === 核心概念 === * '''内在状态(Intrinsic State)''':对象的固定部分,可被多个上下文共享(例如字符的字体、颜色)。 * '''外在状态(Extrinsic State)''':对象的可变部分,由客户端代码传递(例如字符在文本中的位置)。 == 适用场景 == * 系统中存在大量相似对象,且内存占用过高。 * 对象的大部分状态可以外部化。 * 需要缓存或共享对象状态(如游戏中的粒子系统、文本编辑器中的字符渲染)。 == 结构 == <mermaid> classDiagram class Flyweight { <<interface>> +operation(extrinsicState) } class ConcreteFlyweight { -intrinsicState +operation(extrinsicState) } class FlyweightFactory { -flyweights: Map +getFlyweight(key) } class Client { -flyweights: Flyweight[] } Flyweight <|-- ConcreteFlyweight FlyweightFactory o-- Flyweight Client --> FlyweightFactory Client --> Flyweight </mermaid> == 代码示例 == 以下示例展示如何用享元模式优化文本编辑器中的字符渲染: <syntaxhighlight lang="cpp"> #include <iostream> #include <unordered_map> #include <string> // 享元接口 class Character { public: virtual void display(int position) = 0; virtual ~Character() = default; }; // 具体享元类 class ConcreteCharacter : public Character { private: char symbol_; // 内在状态(可共享) public: explicit ConcreteCharacter(char symbol) : symbol_(symbol) {} void display(int position) override { // 外在状态由参数传递 std::cout << "Character '" << symbol_ << "' at position " << position << std::endl; } }; // 享元工厂 class CharacterFactory { private: std::unordered_map<char, Character*> characters_; public: Character* getCharacter(char key) { if (characters_.find(key) == characters_.end()) { characters_[key] = new ConcreteCharacter(key); } return characters_[key]; } ~CharacterFactory() { for (auto& pair : characters_) { delete pair.second; } } }; // 客户端代码 int main() { CharacterFactory factory; // 模拟文本中的字符 std::string text = "Hello, Flyweight!"; for (int i = 0; i < text.size(); ++i) { Character* character = factory.getCharacter(text[i]); character->display(i); // 位置是外在状态 } return 0; } </syntaxhighlight> === 输出示例 === <pre> Character 'H' at position 0 Character 'e' at position 1 Character 'l' at position 2 Character 'l' at position 3 Character 'o' at position 4 ... </pre> === 代码解析 === 1. '''ConcreteCharacter''' 存储内在状态(如字符符号),而外在状态(如位置)通过参数传递。 2. '''CharacterFactory''' 确保相同字符仅创建一个实例。 3. 客户端通过工厂获取享元对象,避免重复创建。 == 实际应用案例 == === 游戏开发中的粒子系统 === 在游戏中,大量粒子(如子弹、火焰)可能共享相同的纹理和动画,但位置和速度不同。享元模式可将纹理作为内在状态共享,而位置作为外在状态动态传递。 === 文档编辑器中的格式设置 === 文本中的相同字体(如“Arial 12pt”)可被多个字符共享,仅存储一次而非每个字符单独保存。 == 优缺点 == {| class="wikitable" |+ 享元模式分析 ! 优点 !! 缺点 |- | 减少内存占用 || 增加代码复杂度 |- | 提高性能(减少对象创建) || 需要妥善管理共享状态 |- | 适用于大规模对象复用 || 可能引入线程安全问题 |} == 数学建模 == 假设系统中有 <math>N</math> 个对象,享元模式将内存占用从 <math>O(N)</math> 降低至 <math>O(K)</math>(<math>K</math> 为唯一内在状态的数量,通常 <math>K \ll N</math>)。 == 扩展思考 == * 结合'''工厂模式'''管理享元对象的生命周期。 * 使用'''弱引用'''(如C++的<code>std::weak_ptr</code>)避免内存泄漏。 * 在多线程环境中,需对享元工厂加锁以保证线程安全。 {{设计模式提示| | 建议 = 在需要高频创建相似对象时优先考虑享元模式。 | 警告 = 过度使用可能导致系统难以维护,需权衡共享与独特性。 }} [[Category:编程语言]] [[Category:C++]] [[Category:C++ 设计模式]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:编程概念导航
(
编辑
)
模板:设计模式提示
(
编辑
)