赞
踩
享元模式(Flyweight Pattern)作为一种高效节省内存的结构型设计模式,其核心在于通过共享技术有效支持大量细粒度对象的重用,从而减少内存占用,提高系统性能。特别是在处理大量相似对象的场景下,享元模式通过区分内部状态(Intrinsic State)和外部状态(Extrinsic State),使得共享成为可能。本文将深入探讨享元模式的应用场景、使用技巧、注意事项,并通过C++11标准代码示例展示其实现细节。
假设我们正在设计一个文本编辑器的文字渲染系统,其中大量的字符对象具有相同的字体和颜色属性,但位置不同。通过享元模式,我们可以有效减少字符对象的创建。
#include <iostream>
#include <unordered_map>
#include <memory>
#include <string>
// 享元接口
class Character {
public:
virtual ~Character() {}
virtual void display(int x, int y) const = 0;
};
// 具体享元角色
class ConcreteCharacter : public Character {
public:
ConcreteCharacter(char c, const std::string& font, int fontSize, const std::string& color)
: character_(c), font_(font), fontSize_(fontSize), color_(color) {}
void display(int x, int y) const override {
std::cout << "Rendering character '" << character_
<< "' at (" << x << ", " << y << ") with font " << font_
<< ", size " << fontSize_ << ", color " << color_ << std::endl;
}
private:
char character_;
std::string font_;
int fontSize_;
std::string color_; // 内部状态
};
// 享元工厂
class CharacterFactory {
public:
std::shared_ptr<Character> getCharacter(char c, const std::string& font, int fontSize, const std::string& color) {
std::string key = std::to_string(c) + font + std::to_string(fontSize) + color;
if (pool_.find(key) == pool_.end()) {
pool_[key] = std::make_shared<ConcreteCharacter>(c, font, fontSize, color);
}
return pool_[key];
}
private:
std::unordered_map<std::string, std::shared_ptr<Character>> pool_;
};
int main() {
CharacterFactory factory;
// 创建多个相同属性但位置不同的字符对象
auto charA = factory.getCharacter('A', "Arial", 12, "Black");
charA->display(10, 20);
auto charB = factory.getCharacter('B', "Arial", 12, "Black");
charB->display(30, 40);
return 0;
}
在这个C++11代码示例中,Character
接口定义了享元对象的行为,而ConcreteCharacter
实现了具体的字符渲染逻辑,包含了字符的内部状态(如字体、大小、颜色)。CharacterFactory
作为享元工厂,负责管理享元对象的创建和缓存,通过使用std::unordered_map
和std::shared_ptr
智能指针,确保了共享实例的高效管理,同时避免了内存泄漏的问题。此例展示了如何通过享元模式有效减少相似对象的内存占用,特别是在需要大量创建对象的场景下,能显著提升程序性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。