C++ 设计模式之享元模式

C++ 设计模式之享元模式

简介

1、享元模式(Flyweight)是一种用于减少应用程序中对象数量的设计模式。在享元模式中,通过使用共享对象来避免创建大量具有细微差别的对象,从而减少内存使用和提高性能。享元模式通常与工厂模式一起使用,以管理共享对象的创建和访问。

2、享元模式 (Flyweight)应用场景包括但不限于:

2.1、大量共享对象的场景:在一些系统中,可能会存在大量的共享对象,例如数据库连接池、线程池等。这些对象可以通过享元模式来实现共享,减少对象的创建和销毁,从而提高系统的性能和可扩展性。

2.2、大数据量的场景:在需要处理大量数据的系统中,可能会存在大量的重复对象,例如图像处理中的像素点、文本处理中的单词等。这些对象可以通过享元模式来共享,减少对象的创建和内存消耗,提高系统的性能和可扩展性。

2.3、高并发的场景:在高并发的系统中,例如电商网站的购物车、在线游戏的排行榜等,可能会存在大量的请求。这些对象可以通过享元模式来共享,减少对象的创建和销毁,从而提高系统的并发处理能力和响应速度。

2.4、分布式系统中的对象共享:在分布式系统中,可能会存在大量的对象需要在不同的节点之间共享,例如分布式缓存系统、分布式锁等。这些对象可以通过享元模式来共享,减少对象的网络传输和存储开销,提高系统的性能和可扩展性。

3、享元模式 (Flyweight)的构成

3.1、享元接口(Flyweight):定义了一个享元对象需要实现的方法,这些方法应该与执行共享对象所需的操作有关。这个接口可能声明一些方法用于存储、外部状态设置以及共享对象的内部状态操作。

c 复制代码
class Character
{
public:
	virtual void display() const = 0;
	virtual ~Character() {};
};

3.2、具体享元(ConcreteFlyweight):实现了Flyweight接口,并为内部状态(即存储在享元对象中的信息)添加存储空间。具体享元类知道如何修改和访问其内部状态。

c 复制代码
class ConcreteCharacter : public Character
{
public:
	ConcreteCharacter(char argGlyph);
	void display() const;
private:
	char glyph;
};

3.3、享元工厂(FlyweightFactory):负责创建和管理享元对象。它确保在系统中只存在唯一的一个享元对象实例。享元工厂类必须能够识别出存储在享元对象中的信息,当需要的时候创建新对象(如果不存在)或者获取已经存在的对象(如果已经存在)。

c 复制代码
class FlyweightFactory
{
public:
	std::shared_ptr<Character> getFlyweight(char glyph);
private:
	std::map<char, std::shared_ptr<Character>> flyweights;
};

4、享元模式 (Flyweight)的优点

4.1、节省资源:减少了系统中对象的数量,节省了内存空间,特别适用于大量重复对象的情况。

4.2、减少实例化的开销:由于对象被复用,因此创建新对象的频率降低,从而减少了实例化的开销。

5、享元模式 (Flyweight)的缺点

5.1、代码复杂度上升:由于引入工厂类、管理共享对象的复杂性,以及客户端和享元对象的管理等,可能会导致系统设计变得复杂。

5.2、对象状态管理复杂化:需要区分内部状态和外部状态,易错,同时需要注意线程安全问题。

简单示例

1、定义

c 复制代码
// 享元基类
class Character
{
public:
	virtual void display() const = 0;
	virtual ~Character() {};
};

// 具体的享元类
class ConcreteCharacter : public Character
{
public:
	ConcreteCharacter(char argGlyph);
	void display() const;
private:
	char glyph;
};

// 享元工厂
class FlyweightFactory
{
public:
	std::shared_ptr<Character> getFlyweight(char glyph);
private:
	std::map<char, std::shared_ptr<Character>> flyweights;
};

2、实现

c 复制代码
ConcreteCharacter::ConcreteCharacter(char argGlyph) : glyph(argGlyph)
{

}

void ConcreteCharacter::display() const
{
	std::cout << glyph;
}

std::shared_ptr<Character> FlyweightFactory::getFlyweight(char glyph)
{
	// 如果已经存在,则返回
	if (flyweights.find(glyph) != flyweights.end())
	{
		return flyweights[glyph];
	}
	auto flyweight = std::make_shared<ConcreteCharacter>(glyph);
	flyweights[glyph] = flyweight;
	return flyweight;
}

3、调用

c 复制代码
FlyweightFactory fly;
std::string document = "AABBCCDDE";
for (char glyph : document)
{
	auto ch = fly.getFlyweight(glyph);
	ch->display();
}
std::cout << std::endl;
相关推荐
old_power33 分钟前
【PCL】Segmentation 模块—— 基于图割算法的点云分割(Min-Cut Based Segmentation)
c++·算法·计算机视觉·3d
涛ing1 小时前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
PaLu-LI2 小时前
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
c++·人工智能·opencv·学习·ubuntu·计算机视觉
攻城狮7号3 小时前
【10.2】队列-设计循环队列
数据结构·c++·算法
小王子10244 小时前
设计模式Python版 单例模式
python·单例模式·设计模式
_DCG_4 小时前
c++常见设计模式之装饰器模式
c++·设计模式·装饰器模式
快乐非自愿4 小时前
「全网最细 + 实战源码案例」设计模式——单例设计模式
java·单例模式·设计模式
阿绵4 小时前
设计模式-模板方法实现
java·开发语言·设计模式
晚秋贰拾伍4 小时前
设计模式的艺术-职责链模式
运维·设计模式·运维开发·责任链模式·开闭原则·单一职责原则