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)共享解析逻辑,仅替换坐标参数

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


相关推荐
数据中穿行4 小时前
迭代器设计模式全方位深度解析
设计模式
数据中穿行4 小时前
观察者设计模式全方位深度解析
设计模式
程序员Terry4 小时前
别老写重复代码了!模版方法模式一次讲透
java·设计模式
数据中穿行4 小时前
建造者模式全方位深度解析
设计模式
数据中穿行5 小时前
组合设计模式全方位深度解析
设计模式
数据中穿行5 小时前
原型设计模式全方位深度解析
设计模式
CRMEB6 小时前
电商项目中订单流程可以使用哪些设计模式?如何开发?
java·设计模式·gitee·开源·php·crmeb
逆境不可逃7 小时前
【从零入门23种设计模式19】行为型之观察者模式
java·开发语言·算法·观察者模式·leetcode·设计模式·动态规划
天若有情6737 小时前
C++设计模式:tur函数——让对象自我裁决的条件选择器
java·c++·设计模式
C++chaofan7 小时前
JUC 并发编程:不可变对象、享元模式与自定义连接池 学习笔记
java·享元模式·并发编程·连接池·juc·不可变对象