当前位置: 首页 > article >正文

23种设计模式 - 享元模式

模式定义

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


模式结构

Flyweight(抽象享元类)

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

适用场景

数控系统刀具库管理:数千种刀具共享型号参数(内部状态),仅记录安装位置(外部状态)。
轴控制器配置复用:相同型号的电机共享控制参数,独立维护位置数据。
减少内存开销:当系统中存在大量重复对象(如G代码指令)时。


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

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

#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)共享解析逻辑,仅替换坐标参数
报警代码管理:相同错误类型共享处理逻辑,独立记录发生时间



http://www.kler.cn/a/554024.html

相关文章:

  • 利用Java爬虫精准获取淘宝分类详情:实战案例指南
  • 使用LlamaIndex查询 MongoDB 数据库,并获取 OSS (对象存储服务) 上的 PDF 文件,最终用Langchain搭建应用
  • 使用GitLab和GitLab-Runner建立CICD流水线
  • 网络安全架构战略 网络安全体系结构
  • LLaMA 3.1 模型在DAMODEL平台的部署与实战:打造智能聊天机器人
  • c++作业
  • 基于Qt/C++实现一个俄罗斯方块游戏(附源码下载链接)
  • Linux 新建用户和组命令全解析
  • 使用Python和OpenCV实现图像像素压缩与解压
  • 升级 SpringBoot3 全项目讲解 — 如何在 SpringBoot3 种用 JsonSchema 来验证 Json是否有效?
  • Jest单元测试
  • 拦截器VS过滤器:Spring Boot中请求处理的艺术!
  • 注意力机制中的QKV形象解释
  • Docker 部署 MySQL 8 详细图文教程
  • Vue 3 工程化打包工具:从理论到实践 (下篇)
  • 机器学习实战(8):降维技术——主成分分析(PCA)
  • 【Golang 面试题】每日 3 题(六十)
  • (LLaMa Factory)大模型训练方法--预训练(Qwen2-0.5B)
  • WebSocket(WS)协议系列(一)基本概念
  • DeepSeek等大模型功能集成到WPS中的详细步骤