享元模式的定义
1.结构型设计模式
2.旨在通过共享对象来最小化内存使用和提高性能
3.享元模式将对象分为可共享的内部状态和不可共享的外部状态,以便多个对象可以共享相同的内部状态。
实现步骤
1.定义抽象享元类:定义一个抽象享元类,它声明了享元对象的操作,并且包含对外部状态进行操作的接口。
2.实现具体享元类:创建具体的享元类,实现了抽象享元类的操作。具体享元类包含了内部状态,并且可以被共享。
3.创建享元工厂类:创建一个享元工厂类,用于管理和提供享元对象。享元工厂类维护了一个享元对象的池,用于存储已经创建的享元对象。
4.使用享元对象:客户端可以通过享元工厂类请求享元对象并使用它们。客户端可以设置或传递外部状态给享元对象,以便个性化地使用享元对象。
代码实例
一个实际的享元模式场景是图形编辑器中的绘图工具。
在一个图形编辑器中,我们可以使用不同的绘图工具(例如画笔、橡皮擦、填充桶等)来创建和编辑图形。每个绘图工具都有自己的属性(例如颜色、线条粗细等),并且可以在画布上执行操作(例如绘制、擦除等)。
在这种情况下,享元模式可以用于管理绘图工具对象的共享。具体而言,享元模式将绘图工具对象分为两部分:内部状态和外部状态。
内部状态:内部状态是指可以被多个绘图工具对象共享的状态,这些状态在绘图工具对象之间不会发生变化。在这个场景中,例如绘图工具的形状、线型等属性是属于内部状态的。
外部状态:外部状态是指会随着绘图工具对象的不同而变化的状态,需要由客户端传递给享元对象。在这个场景中,例如绘图工具的位置、颜色等属性是属于外部状态的。
通过享元模式,我们可以共享绘图工具对象的内部状态,并通过传递不同的外部状态来实现绘图操作。这样可以有效地减少创建大量相似对象的内存消耗,并提高系统的性能。
以下是一个简化的示例代码,演示了在图形编辑器中使用享元模式来管理绘图工具对象的情况:
#include <iostream>
#include <unordered_map>
#include<map>//定义抽象类:绘图工具类(圆形,矩形)等
class DrawingTool
{
public:virtual void draw(int x, int y) = 0; //对外部状态进行操作的接口
};
//实现具体的享元类:具体的绘图工具类
class Brush :public DrawingTool
{
public:explicit Brush(const std::string& shape) :m_shape(shape) {}void draw(int x, int y)override{std::cout << "Drawing " << m_shape << " at position (" << x << ", " << y << ") with brush" << std::endl;}
private:
std::string m_shape;
};
//享元工厂类
class DrawingToolFactory
{
public:DrawingTool* getBrush(const std::string& shape){if (m_brushes.find(shape) == m_brushes.end()){//没找到,就创建一个新的m_brushes[shape] = new Brush(shape);}return m_brushes[shape];}
private:std::map<std::string, DrawingTool*>m_brushes;
};int main()
{DrawingToolFactory factory;DrawingTool* brush1 = factory.getBrush("Circle");brush1->draw(10,10);DrawingTool* brush2 = factory.getBrush("Square");brush2->draw(20, 20);DrawingTool* brush3 = factory.getBrush("Circle");brush1->draw(30, 30);return 0;}