23种设计模式 - 享元模式

模式定义

享元模式(Flyweight Pattern)是一种结构型设计模式,通过共享技术减少大量相似对象的内存占用。它将对象状态分为内部状态(可共享的固有属性)和外部状态(随场景变化的属性),适用于数控系统中需要管理大量重复组件(如刀具、轴控制器)的场景。


模式结构

Flyweight(抽象享元类)

  • 定义对象操作接口(如operate()),声明内部/外部状态处理方法。
    ConcreteFlyweight(具体享元类)
  • 实现抽象接口,存储内部状态(如刀具型号),处理与外部状态(如刀具位置)的交互。
    FlyweightFactory(享元工厂类)
  • 管理享元对象池,通过唯一标识(如刀具ID)创建或获取对象,确保共享唯一性。

适用场景

数控系统刀具库管理:数千种刀具共享型号参数(内部状态),仅记录安装位置(外部状态)。

轴控制器配置复用:相同型号的电机共享控制参数,独立维护位置数据。

减少内存开销:当系统中存在大量重复对象(如G代码指令)时。


C++示例(数控刀具库场景)

场景说明:

设计数控系统的刀具库,相同型号刀具共享材质、尺寸等属性,独立管理安装位置。

cpp 复制代码
#include 
#include 

// 抽象享元类:刀具
class Tool {
public:
    virtual void operate(const std::string& position) = 0; // 外部状态通过参数传入
    virtual ~Tool() = default;
};

// 具体享元类:钻头
class Drill : public Tool {
private:
    std::string model_;  // 内部状态(共享)
    double diameter_;    // 内部状态(共享)
public:
    Drill(const std::string& model, double diameter) 
        : model_(model), diameter_(diameter) {}
    
    void operate(const std::string& position) override {
        std::cout << "使用钻头" << model_ 
                  << " (直径:" << diameter_ << "mm) 在位置 " 
                  << position << " 执行钻孔\n";
    }
};

// 享元工厂类
class ToolFactory {
private:
    std::unordered_map tools_; // 享元池
public:
    Tool* getTool(const std::string& model, double diameter) {
        auto it = tools_.find(model);
        if (it == tools_.end()) {
            Tool* tool = new Drill(model, diameter);
            tools_[model] = tool;
            return tool;
        }
        return it->second;
    }

    ~ToolFactory() {
        for (auto& pair : tools_) delete pair.second;
    }
};

// 客户端使用
int main() {
    ToolFactory factory;

    // 获取共享刀具(内部状态相同)
    Tool* tool1 = factory.getTool("DR-2024", 5.0);
    Tool* tool2 = factory.getTool("DR-2024", 5.0); // 复用对象
    
    // 设置外部状态(位置不同)
    tool1->operate("X100 Y200");
    tool2->operate("X300 Z150");

    return 0;
}

输出结果:

复制代码
使用钻头DR-2024 (直径:5mm) 在位置 X100 Y200 执行钻孔  
使用钻头DR-2024 (直径:5mm) 在位置 X300 Z150 执行钻孔

优势与局限

优势:内存减少50%+(当存在10,000个重复刀具时)

局限:增加代码复杂度,需严格区分内部/外部状态


数控系统应用扩展

G代码指令共享:相同指令模板(如G01)共享解析逻辑,仅替换坐标参数

报警代码管理:相同错误类型共享处理逻辑,独立记录发生时间


相关推荐
鱼跃鹰飞2 小时前
DDD中的防腐层
java·设计模式·架构
会员果汁3 小时前
15.设计模式-组合模式
设计模式·组合模式
YUEchn4 小时前
无处不在的Agent
设计模式·llm·agent
茶本无香7 小时前
设计模式之二—原型模式:灵活的对象克隆机制
java·设计模式·原型模式
GISer_Jing7 小时前
Nano Banana+LoveArt三大核心功能解析:重构AI设计全链路,让创意落地更高效
人工智能·设计模式·aigc
会员果汁8 小时前
14.设计模式-备忘录模式
设计模式·备忘录模式
xiaolyuh12318 小时前
Spring 框架 核心架构设计 深度详解
spring·设计模式·spring 设计模式
GISer_Jing1 天前
智能体工具使用、规划模式
人工智能·设计模式·prompt·aigc
GISer_Jing1 天前
AI Agent:学习与适应、模型上下文协议
人工智能·学习·设计模式·aigc
小马爱打代码1 天前
MyBatis设计模式:构建者、工厂、代理模式
设计模式·mybatis·代理模式