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

享元模式(Flyweight)在 C++ 中主要用于减少内存占用,通过共享大量细粒度对象来提升性能,特别适用于对象数量庞大、状态可分“内在”与“外在”的场景(比如文字编辑器中的字符、游戏中的子弹、GUI 中的图标等)。
内在状态(Intrinsic State)是共享的、不可变的,属于享元对象自身,比如字符的字体、大小、颜色(若统一);
外在状态(Extrinsic State)是不共享的、变化的,由客户端维护并传入,比如字符在文档中的位置、行号、是否选中等。
关键不是“把对象变少”,而是“避免重复创建相同内在状态的对象”。
用 std::map 或 std::unordered_map 缓存已创建的享元实例,按内在状态作 key 查找复用:
示例关键片段:
立即学习“C++免费学习笔记(深入)”;
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【性能优化】的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号