享元模式——C++实现

发布于:2025-02-10 ⋅ 阅读:(24) ⋅ 点赞:(0)

目录

1. 享元模式简介

2. 代码示例


1. 享元模式简介

享元模式是一种结构型模式

享元模式用于缓存共享对象,降低内存消耗。共享对象相同的部分,避免创建大量相同的对象,减少内存占用。

享元模式需要将对象分成内部状态和外部状态两个部分

所谓内部状态指的是可以共享的状态,外部状态指的是会随着对象的使用而改变的的状态。

比如,如果要模拟一个五子棋程序。对棋子来说,棋子的图片就属于内部状态,而棋子的位置和大小就属于外部状态。棋子的图片可以被所有使用棋子的地方所共享,棋子的位置和大小每个使用的地方都不一样。


享元模式通常要搭配简单工厂模式一起使用,在简单工厂内使用一个享元对象的缓存池,缓存享元对象。

2. 代码示例

就以棋子模拟程序作为示例,代码如下所示:

#if 1

#include <iostream>
#include <map>
#include <memory>
#include <string>

using namespace std;

enum ChessPieceType { White, Black };

class ChessPiece {
public:
	virtual void Draw(int x, int y) = 0;
	virtual ~ChessPiece() {}
};

class WhiteChessPiece : public ChessPiece
{
public:
	void Draw(int x, int y) override
	{
		cout << "在(" << x << "," << y << ") 位置放置白棋子" << endl;
	}
};

class BlackChessPiece : public ChessPiece
{
public:
	void Draw(int x, int y) override
	{
		cout << "在(" << x << "," << y << ") 位置放置黑棋子" << endl;
	}
};

class ChessFactory
{
public:
	static shared_ptr<ChessPiece> CreateChessPiece(ChessPieceType type)
	{
		if (chessPieces.find(type) == chessPieces.end())
		{
			if (type == White)
			{
				chessPieces[type] = make_shared<WhiteChessPiece>();
			}
			else if (type == Black)
			{
				chessPieces[type] = make_shared<BlackChessPiece>();
			}
		}
		return chessPieces[type];
	}
private:
	static map<ChessPieceType, shared_ptr<ChessPiece>> chessPieces;
};

map<ChessPieceType, shared_ptr<ChessPiece>> ChessFactory::chessPieces;

int main()
{
	auto piece1 = ChessFactory::CreateChessPiece(ChessPieceType::White);
	piece1->Draw(1, 2);

	auto piece2 = ChessFactory::CreateChessPiece(ChessPieceType::Black);
	piece2->Draw(3, 4);

	auto piece3 = ChessFactory::CreateChessPiece(ChessPieceType::White);
	piece3->Draw(5, 6);

	return 0;
}

#endif

运行截图如下:


网站公告

今日签到

点亮在社区的每一天
去签到