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

结构型模式---享元模式

概念

享元模式是一种结构型设计模式,他摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。
内在状态:就是不变的在各个对象中重复使用的成员变量。
外在状态:每个对象各自不同的情景的数据成员变量。会通过外部函数进行修改。

适用场景

在程序中支持大量的对象且没有足够的内存容量时使用享元模式

使用方式

1、分析代码需求,将成员变量分解为两个部分,

内在状态:就是不变的在各个对象中重复使用的成员变量。

外在状态:每个对象各自不同的情景的数据成员变量。会通过外部函数进行修改。

将原始对象拆分为情景类和享元类。

2、创建一个享元类,用于存储内在状态成员变量。

3、创建一个情景类,用于存储外在状态的成员变量。并在这个情景类中创建一个享元类的引用。

4、创建一个享元工厂类,创建需要的享元对象,如果没有就创建一个新的享元对象并添加到容器或者工厂中。

5、当创建完整的数据类的时候可以去容器或者工厂中寻找有没有需要的享元对象,有的话直接拿出来用,没有的话创建新的。

类关系结构

在这里插入图片描述

代码示例

#include "XiangYuanMoShi.h"

int main()
{
    std::cout << "欢迎东哥来到设计模式的世界!\n";

    //创建一个size = 2,color= 绿色,伤害 = 100的子弹
    BulletShareFactory factory;
    Bullet* bullet = new Bullet();
    bullet->x = 100;
    bullet->y = 100;
    bullet->m_share = factory.getBulletShare(100, "绿色","100");
    bullet->display();
    Bullet* bullet2 = new Bullet();
    bullet2->x = 200;
    bullet2->y = 200;
    bullet2->m_share = factory.getBulletShare(100, "绿色", "100");
    bullet2->display();
}
#pragma once
#include <string>
#include <vector>
#include <iostream>
using namespace std;
//假设有个场景,在一个游戏中我们需要设置子弹的样式,在显示的过程中我们要随时修改子弹的位置
//和方向。子弹有不同的类型(大小、颜色、伤害)

//享元类
class BulletShare
{
public:
	BulletShare() {}
	~BulletShare() {}
	//内在数据
	int size;
	string color;
	string hurt;
};

//情景类
class Bullet {
public:
	Bullet() {}
	~Bullet() {}

	//外在数据
	int x;
	int y;
	int direction;

	//内在对象引用
	BulletShare* m_share = nullptr;

	void display() {
		cout << "x:" << x << "   y:" << y<<"   size:" << m_share->size << endl;
		cout << "share地址:" << m_share << endl;
	}
};

//享元工厂类
class BulletShareFactory {
public:
	BulletShareFactory() {}
	~BulletShareFactory() {}
	//享元类数据存储
	vector<BulletShare*> m_vBulletShare;
	BulletShare* getBulletShare(int size, string color, string hurt) {
		BulletShare* share = nullptr;
		if (m_vBulletShare.size() > 0) {
			for (int i = 0; i < m_vBulletShare.size(); i++) {
				if (m_vBulletShare[i]->color == color &&
					m_vBulletShare[i]->size == size &&
					m_vBulletShare[i]->hurt == hurt) {
					share = m_vBulletShare[i];
					break;
				}
			
			}
		}
		if(!share){
			share = new BulletShare();
			if (share) {
				share->color = color;
				share->hurt = hurt;
				share->size = size;
				m_vBulletShare.push_back(share);
			}
			
		}
		return share;
	}
};


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

相关文章:

  • 【Qt】编程基础
  • UniApp+Vue3实现高性能无限滚动卡片组件:垂直滑动、触摸拖拽与动态导航的完美结合
  • SQL Server2022版+SSMS安装教程(保姆级)
  • MapReduce编程模型
  • 【AI+智造】在阿里云Ubuntu 24.04上部署DeepSeek R1 14B的完整方案
  • 更换k8s容器运行时环境为docker
  • 菜鸟之路Day18一一IO流综合练习
  • 处理AAL的.nii文件:python获取AAL的各个区域的质心坐标
  • STM32之影子寄存器
  • 【愚公系列】《Python网络爬虫从入门到精通》035-DataFrame数据分组统计整理
  • 一文掌握python中正则表达式的各种使用
  • 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库
  • Python安装环境变量
  • java项目之基于ssm的物流配送人员车辆调度管理系统的设计与实现(源码+文档)
  • 太速科技-887-基于 RFSoC 47DR的8T8R 100Gbps 软件无线电光纤前端卡
  • Mysql官网下载Windows、Linux各个版本
  • 48页PDF | GBT 36073-2018 数据管理能力成熟度评估模型 (附下载)
  • [讨论] oracle数据库游标更新时sql%rowcount影响数量记录的一个疑问
  • 本地部署AI大模型之PyTorch:如何使用whl文件安装PyTorch
  • Linux上用C++和GCC开发程序实现不同MySQL实例下单个Schema之间的稳定高效的数据迁移