中国风 网站模板,做自己照片视频网站,网营科技,wordpress 无法登录界面概念
享元模式是一种结构型设计模式#xff0c;他摒弃了在每个对象中保存所有数据的方式#xff0c;通过共享多个对象所共有的相同状态#xff0c;让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态#xff1a;就…概念
享元模式是一种结构型设计模式他摒弃了在每个对象中保存所有数据的方式通过共享多个对象所共有的相同状态让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态就是不变的在各个对象中重复使用的成员变量。 外在状态每个对象各自不同的情景的数据成员变量。会通过外部函数进行修改。
适用场景
在程序中支持大量的对象且没有足够的内存容量时使用享元模式
使用方式
1、分析代码需求将成员变量分解为两个部分
内在状态就是不变的在各个对象中重复使用的成员变量。
外在状态每个对象各自不同的情景的数据成员变量。会通过外部函数进行修改。
将原始对象拆分为情景类和享元类。
2、创建一个享元类用于存储内在状态成员变量。
3、创建一个情景类用于存储外在状态的成员变量。并在这个情景类中创建一个享元类的引用。
4、创建一个享元工厂类创建需要的享元对象如果没有就创建一个新的享元对象并添加到容器或者工厂中。
5、当创建完整的数据类的时候可以去容器或者工厂中寻找有没有需要的享元对象有的话直接拿出来用没有的话创建新的。
类关系结构 代码示例
#include XiangYuanMoShi.hint main()
{std::cout 欢迎东哥来到设计模式的世界!\n;//创建一个size 2color 绿色伤害 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() {}//享元类数据存储vectorBulletShare* 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;}
};