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

embedded/2025/3/1 16:46:03/

概念

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

适用场景

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

使用方式

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.ppmy.cn/embedded/169095.html

相关文章

Unreal开发中使用JNI调用语法

使用Unreal引擎做Android端的应用开发&#xff0c;不可避免的会用到第三方Java接口&#xff0c;这就涉及到了JNI调用。Unreal自己有封装一套接口来调用&#xff0c;这里做个总结&#xff0c;主要是在一些自定义的数据类型转换上。其实可以跟到引擎源码的位置具体看实现。 从上…

什么是标记 PDF(Tagged PDF)?

什么是标记 PDF&#xff08;Tagged PDF&#xff09;&#xff1f; 标记 PDF 是一种包含额外信息的 PDF 文件&#xff0c;这些信息用于定义文档的结构&#xff08;如文本流、标题、表格、段落等&#xff09;。这非常有用&#xff0c;因为它可以使内容更加可访问&#xff08;文本…

短跑怎么训练提高最快·棒球1号位

棒球运动员的短跑能力直接影响跑垒、防守和进攻效率&#xff0c;提升短跑速度需结合专项需求&#xff08;如爆发力、加速度、变向能力&#xff09;进行系统训练。以下为针对性训练方案&#xff1a; 一、专项爆发力训练&#xff08;提升起跑速度&#xff09; 抗阻冲刺 用弹力带…

Angular Superresolution with Antenna Pattern Errors论文阅读

Angular Superresolution with Antenna Pattern Errors 1. 论文的研究目标与实际问题意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法与模型2.1 天线方向图误差建模2.2 改进算法:CID + 重加权 l 1 l_1 l1​最小化2.2.1 传统CID算法局限性2.2.2 新算法核心步骤2.2.3 …

单片机死机跑飞的原因

单片机死机跑飞的原因 硬件问题一.电源问题二.时钟异常三.复位电路故障四.电磁干扰&#xff08;EMI&#xff09;五.外设负载过重六.温度影响 软件原因一.内存管理问题二.中断处理错误三.看门狗配置不当四.多任务冲突 记录一下导致单片机跑飞可能出现的原因。 硬件问题 一.电源…

属性的设置

笔记 class Student:def __init__(self, name, gender):self.name nameself.__gender gender # self.__gender 是私有的实例属性# 使用property 修改方法&#xff0c;将方法转成属性使用propertydef gender(self):return self.__gender# 将我们的gender这个属性设置为可写属…

Linux学习笔记1

root用户 进入方式 su - root 可以使用exit退回到上一个用户,或者ctrl d 可以使用sudo命令为普通用户授权 但需要为普通用户配置sudo认证 执行visudo命令会自动打开/etc/sudoers 在文件的最后添加:用户名 ALL(ALL) NOPASSWD: ALL 最后wq保存 用户和用户组 Linux可以 配置多个用…

微信小程序换行符真机不生效问题

标签必须使用text包裹 <text>你好你好{{"\n"}}你好你好</text>上面代码在模拟器正常&#xff0c;在真机上面原样显示/n文本了&#xff0c;没实现换行效果 <text>你好你好{{"\n"}}你好你好</text>改成这种格式的话&#xff0c;模…