【23】c++设计模式——>享元模式

享元模式的定义

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值