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

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

概念

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

适用场景

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

使用方式

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;}
};

相关文章:

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

概念 享元模式是一种结构型设计模式&#xff0c;他摒弃了在每个对象中保存所有数据的方式&#xff0c;通过共享多个对象所共有的相同状态&#xff0c;让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态&#xff1a;就…...

2025年渗透测试面试题总结- 深某服-漏洞研究员实习(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 深信服-漏洞研究员实习 1. 在XX实习时做了什么 2. 渗透测试的思路简单描述 3. 护网中承担什么角色 4…...

(13)Anaconda 安装配置详解

1. Anaconda 简介 Anaconda 是一个用于科学计算和数据分析的 Python 发行版,它集成了 Python 解释器、大量常用的科学计算库以及强大的包管理工具。 2. Anaconda 主要特点 丰富的库集合:包含了超过 1500 个用于科学计算、数据分析、机器学习等领域的常用 Python 库,例如 N…...

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革

随着人工智能、大模型等技术的蓬勃发展&#xff0c;生成式AI应用全面爆发。在此背景下&#xff0c;服务机器人作为大模型技术在端侧落地的关键场景&#xff0c;迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备&#xff0c;服务机器人需要应对复杂场景下的感知、决策和…...

[内网安全] Windows 域认证 — Kerberos 协议认证

&#x1f31f;想系统化学习内网渗透&#xff1f;看看这个&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;Kerberos 协议简介 Kerberos 是一种网络认证协议&#xff0c;其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过…...

[Computer Vision]实验七:图像检索

目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”&#xff08;vision vocabulary&#xff09; 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…...

C++之thread_local变量

C之thread_local变量_c threadlocal-CSDN博客 thread_local简介 thread_local 是 C11 为线程安全引进的变量声明符。表示对象的生命周期属于线程存储期。 线程局部存储(Thread Local Storage&#xff0c;TLS)是一种存储期(storage duration)&#xff0c;对象的存储是在…...

【国产Linux | 银河麒麟】麒麟化龙——KylinOS下载到安装一条龙服务,起飞!

&#x1f5fa;️博客地图 &#x1f4cd;一、下载地址 &#x1f4cd;二、 系统安装 本文基于Windows操作系统vmware虚拟机安装 一、下载地址 官网&#xff1a;产品试用申请国产操作系统、麒麟操作系统——麒麟软件官方网站 下载自己需要的版本&#xff0c;完成后&#xff0c…...

(接“使用js去复制网页内容的方法”)js中的execCommand怎么复制富文本内容解析

document.execCommand(copy) 是传统的剪贴板操作方法&#xff0c;但它主要用于复制纯文本内容。如果你想复制富文本内容&#xff08;包括 HTML 标签和样式&#xff09;&#xff0c;需要结合一些技巧来实现。以下是具体方法&#xff1a; 方法&#xff1a;通过创建隐藏的富文本元…...

npm ERR! code 128 npm ERR! An unknown git error occurred

【问题描述】 【问题解决】 管理员运行cmd&#xff08;右键window --> 选择终端管理员&#xff09; 执行命令 git config --global url.“https://”.insteadOf ssh://git cd 到项目目录 重新执行npm install 个人原因&#xff0c;这里执行npm install --registryhttps:…...

解决Leetcode第3470题全排列IV

3470.全排列IV 难度&#xff1a;困难 问题描述&#xff1a; 给你两个整数n和k&#xff0c;一个交替排列是前n个正整数的排列&#xff0c;且任意相邻两个元素不都为奇数或都为偶数。 返回第k个交替排列&#xff0c;并按字典序排序。如果有效的交替排列少于k个&#xff0c;则…...

MyBatis 配置文件核心

MyBatis 配置文件核心标签解析 以下是针对你的笔记中的三个核心标签的详细解析&#xff0c;帮助你全面理解它们的用途和配置逻辑。 1. properties 标签&#xff1a;动态加载外部配置 功能 将环境相关的配置&#xff08;如数据库连接、密钥等&#xff09;与 MyBatis 核心配置…...

bert模型笔记

1.各预训练模型说明 BERT模型在英文数据集上提供了两种大小的模型&#xff0c;Base和Large。Uncased是意味着输入的词都会转变成小写&#xff0c;cased是意味着输入的词会保存其大写&#xff08;在命名实体识别等项目上需要&#xff09;。Multilingual是支持多语言的&#xff0…...

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…...

推荐算法和推荐系统入门第一趴

以下是推荐系统技术总结的架构梳理和建议表达思路&#xff1a; 从原理到生产环境&#xff1a;推荐系统核心技术与实战代码解析 一、推荐算法的演进图谱 传统算法三剑客 ![推荐系统算法分类示意图] &#xff08;使用Mermaid绘制算法分类关系图&#xff0c;清晰展示技术演进&am…...

unity pico开发 四 物体交互 抓取 交互层级

文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor脚本 并添加一个球形碰撞盒&#xff0c;勾选isTrigger,调整大小为0.1 …...

基于深度学习的青花瓷图像检索系统开发与实现

目录 1.研究背景与目的 1.1课题背景 1.2研究目的 二、调研资料情况 2.1图像分割研究现状 2.2图像检索调研 2.2.1选择深度学习进行检索的原因及优势 2.2.2基于深度学习的图像检索技术的发展 2.2.3基于深度学习的图像检索的研究重点 2.3基于深度学习的图像检索方法调研 …...

uniapp 系统学习,从入门到实战(八)—— Vuex 的使用

全篇大概 4500 字(含代码)&#xff0c;建议阅读时间 30min &#x1f4da; 目录 Vuex核心概念解析在 UniApp 中集成Vuex状态管理与数据共享实践总结 一、Vuex 核心概念解析 1.1 什么是状态管理 在跨多组件的大型应用中&#xff0c;不同页面/组件需要共享和修改相同数据时&am…...

Vue Hooks 深度解析:从原理到实践

Vue Hooks 深度解析&#xff1a;从原理到实践 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;点我试试&#xff01;&#xff01; 文章目录 Vue Hooks 深度解析&#xff1a;从原理到实践一、背景…...

django中序列化器serializer 的高级使用和需要注意的点

在 Django REST framework(DRF)中,序列化器(Serializer)是一个强大的工具,用于将复杂的数据类型(如 Django 模型实例)转换为 Python 原生数据类型,以便将其渲染为 JSON、XML 等格式,同时也能将接收到的外部数据反序列化为 Django 模型实例。以下将介绍序列化器的高级…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...