目录
享元模式(Flyweight Pattern)是一种【结构型】设计模式,它通过共享对象来减少内存使用和提高性能。该模式将对象的状态分为内部状态(可共享的不变部分)和外部状态(不可共享的变化部分),通过共享内部状态对象并动态注入外部状态,实现对象的高效复用。
一、模式核心概念与结构
享元模式包含四个核心角色:
- 抽象享元(Flyweight):定义共享接口,声明处理外部状态的方法。
- 具体享元(Concrete Flyweight):实现抽象享元接口,包含内部状态并处理外部状态。
- 享元工厂(Flyweight Factory):创建和管理享元对象,确保合理共享。
- 客户端(Client):通过工厂获取享元对象,并为其提供外部状态。
二、C++ 实现示例:文本格式化系统
以下是一个经典的享元模式示例,演示如何通过共享字体对象减少内存占用:
#include <iostream>
#include <string>
#include <unordered_map>
#include <memory>
// 抽象享元:字体
class Font {
public:
virtual void render(const std::string& text) = 0;
virtual ~Font() {
}
};
// 具体享元:具体字体实现
class ConcreteFont : public Font {
private:
std::string fontName; // 内部状态:字体名称,不可变
int fontSize; // 内部状态:字体大小,不可变
public:
ConcreteFont(const std::string& name, int size)
: fontName(name), fontSize(size) {
}
// 处理外部状态:文本内容
void render(const std::string& text) override {
std::cout << "Rendering '" << text << "' in "
<< fontName << " size " << fontSize << std::endl;
}
};
// 享元工厂:管理字体对象池
class FontFactory {
private:
std::unordered_map<std::string, std::shared_ptr<Font>> fontPool;
public:
// 获取字体对象(如果不存在则创建,否则复用)
std::shared_ptr<Font> getFont(const std::string& fontKey) {
// 解析字体键(例如:"Arial-12")
size_t pos = fontKey.find('-');
if (pos == std::string::npos) {
throw std::invalid_argument("Invalid font key format");
}
std::string name = fontKey.substr(0, pos);
int size = std::stoi(fontKey.