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