当前位置: 首页 > article >正文

享元模式——C++实现

目录

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

运行截图如下:


http://www.kler.cn/a/530487.html

相关文章:

  • ChatGPT-4o和ChatGPT-4o mini的差异点
  • MATLAB基础应用精讲-【数模应用】梯度直方图(HOG)(附C++和python代码实现)(二)
  • 基于WiFi的智能照明控制系统的设计与实现(论文+源码)
  • OpenAI 实战进阶教程 - 第二节:生成与解析结构化数据:从文本到表格
  • java练习(5)
  • 2 MapReduce
  • Java基础知识总结(四十)--Java.util.Properties
  • 浅析服务器虚拟化技术
  • unity学习26:用Input接口去监测: 鼠标,键盘,虚拟轴,虚拟按键
  • Leetcode:598
  • 深入核心:一步步手撕Tomcat搭建自己的Web服务器
  • Ubuntu 下 nginx-1.24.0 源码分析 ngx_debug_init();
  • 构建一个文档助手Agent:提升知识管理效率的实践
  • CUDA内存模型
  • 力扣经典题目之3无重复字符的最长子串
  • STL之初识string
  • 浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉_json转formdata
  • Baklib推动内容中台与人工智能技术的智能化升级与行业变革
  • Qt 5.14.2 学习记录 —— 이십삼 绘图API
  • MATLAB基础应用精讲-【数模应用】梯度直方图(HOG)(附C++和python代码实现)(二)
  • 攻防世界 php2
  • 物业综合管理系统助力社区服务创新提升管理效率与住户体验
  • Hive 整合 Spark 全教程 (Hive on Spark)
  • [SAP ABAP] Debug Skill
  • JavaScript面向对象编程:Prototype与Class的对比详解
  • 【最后203篇系列】004 -Smarklink