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

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


相关推荐
付聪12105 小时前
装饰器模式
设计模式
扣丁梦想家5 小时前
设计模式教程:外观模式(Facade Pattern)
设计模式·外观模式
強云5 小时前
23种设计模式 - 装饰器模式
c++·设计模式·装饰器模式
強云5 小时前
23种设计模式 - 外观模式
设计模式·外观模式
鄃鳕6 小时前
单例模式【C++设计模式】
c++·单例模式·设计模式
扣丁梦想家9 小时前
设计模式教程:命令模式(Command Pattern)
设计模式·命令模式
強云10 小时前
23种设计模式 - 迭代器模式
设计模式·迭代器模式
小王子102410 小时前
设计模式Python版 迭代器模式
python·设计模式·迭代器模式
道友老李10 小时前
【设计模式精讲】创建型模式之原型模式(深克隆、浅克隆)
设计模式·原型模式
攻城狮7号10 小时前
【第二节】C++设计模式(创建型模式)-抽象工厂模式
c++·设计模式·抽象工厂模式