【C++】享元模式

享元模式(Flyweight Pattern)是一种【结构型】设计模式,它通过共享对象来减少内存使用和提高性能。该模式将对象的状态分为内部状态(可共享的不变部分)和外部状态(不可共享的变化部分),通过共享内部状态对象并动态注入外部状态,实现对象的高效复用。

一、模式核心概念与结构

享元模式包含四个核心角色:

  1. 抽象享元(Flyweight):定义共享接口,声明处理外部状态的方法。
  2. 具体享元(Concrete Flyweight):实现抽象享元接口,包含内部状态并处理外部状态。
  3. 享元工厂(Flyweight Factory):创建和管理享元对象,确保合理共享。
  4. 客户端(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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenC++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值