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

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


相关推荐
找了一圈尾巴38 分钟前
设计模式(创建型)-建造者模式
设计模式·建造者模式
HashFlag4 小时前
Go常用的设计模式
开发语言·设计模式·golang
payload4 小时前
创建型设计模式详解
设计模式
有龍则灵4 小时前
装饰器设计模式在Dubbo中的应用—源码级解析
设计模式·dubbo
C4程序员4 小时前
项目设计模式:责任链模式
设计模式·责任链模式
深情不及里子8 小时前
每天认识一个设计模式-桥接模式:在抽象与实现的平行宇宙架起彩虹桥
设计模式·桥接模式
Hanson Huang9 小时前
23种设计模式-模板方法(Template Method)设计模式
java·设计模式·模板方法模式·行为型设计模式
木子庆五9 小时前
Android设计模式之观察者模式
android·观察者模式·设计模式
此木|西贝10 小时前
【设计模式】策略模式
设计模式·策略模式
有龍则灵10 小时前
责任链设计模式在Dubbo中的应用深度解析
设计模式·dubbo