C++中的享元模式

目录

享元模式(Flyweight Pattern)

实际应用

文字编辑器中的字符

修仙游戏中的地图瓦片

图形编辑器中的图形对象

总结


享元模式(Flyweight Pattern)

享元模式是一种结构型设计模式,用于减少对象的内存使用和提高性能。该模式通过共享相似对象之间的公共部分来最小化内存使用。这些公共部分称为享元(Flyweight),而不同的部分称为非共享部分。

实际应用

文字编辑器中的字符

假设正在开发一个文字编辑器,这就可以使用享元模式来共享文本中重复出现的字符,减少内存使用。

#include <iostream>
#include <unordered_map>
#include <memory>// 享元类:字符
class Character {
private:char symbol;// 非共享状态可以作为外部状态int fontSize;
public:Character(char symbol, int fontSize) : symbol(symbol), fontSize(fontSize) {}void display(int position) const {std::cout << "Character '" << symbol << "' displayed at position " << position<< " with font size " << fontSize << "\n";}
};// 享元工厂类
class CharacterFactory {
private:std::unordered_map<char, std::shared_ptr<Character>> characters;
public:std::shared_ptr<Character> getCharacter(char symbol, int fontSize) {if (characters.find(symbol) == characters.end()) {characters[symbol] = std::make_shared<Character>(symbol, fontSize);}return characters[symbol];}
};int main() {CharacterFactory characterFactory;// 使用享元工厂创建并共享字符auto char1 = characterFactory.getCharacter('A', 12);auto char2 = characterFactory.getCharacter('B', 12);auto char3 = characterFactory.getCharacter('A', 14);auto char4 = characterFactory.getCharacter('B', 12);char1->display(1);char2->display(2);char3->display(3);char4->display(4);return 0;
}

修仙游戏中的地图瓦片

假设游戏中有许多地图瓦片,这就可以使用享元模式来共享相同类型的地图瓦片。

#include <iostream>
#include <unordered_map>
#include <memory>// 享元类:地图瓦片
class MapTile {
private:int type;// 非共享状态可以作为外部状态int x, y;
public:MapTile(int type, int x, int y) : type(type), x(x), y(y) {}void draw() const {std::cout << "Drawing map tile of type " << type << " at position (" << x << ", " << y << ")\n";}
};// 享元工厂类
class MapTileFactory {
private:std::unordered_map<int, std::shared_ptr<MapTile>> mapTiles;
public:std::shared_ptr<MapTile> getMapTile(int type, int x, int y) {int key = type * 10000 + x * 100 + y;if (mapTiles.find(key) == mapTiles.end()) {mapTiles[key] = std::make_shared<MapTile>(type, x, y);}return mapTiles[key];}
};int main() {MapTileFactory mapTileFactory;// 使用享元工厂创建并共享地图瓦片auto tile1 = mapTileFactory.getMapTile(1, 0, 0);auto tile2 = mapTileFactory.getMapTile(2, 1, 0);auto tile3 = mapTileFactory.getMapTile(1, 0, 0);auto tile4 = mapTileFactory.getMapTile(2, 1, 0);tile1->draw();tile2->draw();tile3->draw();tile4->draw();return 0;
}

图形编辑器中的图形对象

假设正在开发一个图形编辑器,编辑器中有许多图形对象。这时候就可以使用享元模式来共享相同类型的图形对象。

#include <iostream>
#include <unordered_map>
#include <memory>// 享元类:图形对象
class Shape {
protected:std::string type;// 非共享状态可以作为外部状态int x, y;
public:Shape(const std::string& type, int x, int y) : type(type), x(x), y(y) {}virtual void draw() const = 0;
};// 具体享元类:圆形
class Circle : public Shape {
public:Circle(int x, int y) : Shape("Circle", x, y) {}void draw() const override {std::cout << "Drawing " << type << " at position (" << x << ", " << y << ")\n";}
};// 享元工厂类
class ShapeFactory {
private:std::unordered_map<std::string, std::shared_ptr<Shape>> shapes;
public:std::shared_ptr<Shape> getShape(const std::string& type, int x, int y) {if (shapes.find(type) == shapes.end()) {if (type == "Circle") {shapes[type] = std::make_shared<Circle>(x, y);} // 可以添加更多类型的图形对象}return shapes[type];}
};int main() {ShapeFactory shapeFactory;// 使用享元工厂创建并共享图形对象auto circle1 = shapeFactory.getShape("Circle", 0, 0);auto circle2 = shapeFactory.getShape("Circle", 1, 1);auto circle3 = shapeFactory.getShape("Circle", 0, 0);auto circle4 = shapeFactory.getShape("Circle", 1, 1);circle1->draw();circle2->draw();circle3->draw();circle4->draw();return 0;
}

总结

享元模式可以在减少内存使用和提高性能方面发挥作用,因为享元模式可以有效地共享相似对象之间的公共部分,从而减少内存占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04 解决 firefox 中文界面乱码

问题复现 在为Ubuntu 22.04 Server安装完整的GNOME 42.01桌面后&#xff0c;将桌面语言设置为中文时&#xff0c;打开Firefox可能会出现中文乱码的问题。经过网上调查发现&#xff0c;这个问题是由Snap软件包引起的。 解决方案 为了避免在Ubuntu 22.04中文模式下的乱码问题…

Java解析Json格式数据

首先通过一定的方法得到String类型的Json数据。 然后利用fastjson中的JSON的parseObject()将String解析为JSONObject 然后通过get方法得到某个键对应的值&#xff1a; private String getOpenid(String code) {Map<String, String> map new HashMap<>();map.put(&…

数学建模基础:非线性模型

目录 前言 一、非线性方程组 二、非线性规划 三、微分方程模型 四、非线性模型的应用 五、实例示范&#xff1a;传染病传播模型 实例总结 五、总结 前言 非线性模型用于描述变量之间的非线性关系&#xff0c;相比线性模型&#xff0c;其数学形式更为复杂&#xff0c;但…

AI大模型会如何颠覆手机?

导语&#xff1a;大模型在手机端的落地&#xff0c;不仅仅是AI进入人类生活的开始&#xff0c;也是行业发生颠覆&#xff0c;新老巨头进行更替的时刻。 将大模型变小&#xff0c;再塞进手机&#xff0c;会给人们的生活带来怎样的影响&#xff1f; 最近&#xff0c;荣耀成为了…

【杂记-浅谈实现流量控制】

一、流量控制概述 流量控制是计算机网络中的一个关键技术&#xff0c;它涉及到的不仅仅是单一的技术层面&#xff0c;而是涵盖了从物理层到应用层的多个层次。在网络通信中&#xff0c;流量控制技术通过各种手段对数据流量进行管理和调控&#xff0c;以防止网络拥堵、提高网络…

Java基础学习-流程控制语句-顺序结构-分支结构-循环结构

目录 顺序结构&#xff1a; 分支结构&#xff1a; if语句&#xff1a; 第一种格式&#xff1a; if第二种格式&#xff1a; 案例练习 if第三种格式&#xff1a; switch语句&#xff1a; 格式&#xff1a; switch其他知识点&#xff1a; 循环结构&#xff1a; for循环…

centos安装多实例mysql

参考&#xff1a;CentOS7 单机配置mysql多实例运行-腾讯云开发者社区-腾讯云

yolov8图像分割训练

1.背景 最近在做一个AI项目&#xff0c;需要用到yolov8的实例分割功能来确定一个不规则区域&#xff0c;从而找出不规则区域的坐标完成大致定位&#xff0c;以前有用过yolov8的目标检测功能&#xff0c;实际上yolov8的分割功能和检测功能大同小异。本博客将仔细分享使用yolov8图…

给电脑bios主板设置密码

增强安全性&#xff1a;防止未经授权的人员更改 BIOS 中的重要设置&#xff0c;如启动顺序、硬件配置等。这有助于保护计算机系统的稳定性和数据的安全性。防止恶意篡改&#xff1a;阻止可能的攻击者或恶意软件通过修改 BIOS 设置来破坏系统或获取敏感信息。数据保护&#xff1…

多功能声学综合馆:气膜声学环境的创新解决方案—轻空间

多功能声学综合馆作为一种创新的建筑解决方案&#xff0c;成功地解决了传统气膜馆内部噪音问题&#xff0c;为用户提供了一个宁静、舒适的环境。轻空间依托科研院校&#xff0c;研究出与气膜匹配的复合声学材料以及悬挂安装工艺&#xff0c;既保证气膜安全&#xff0c;同时实现…

C语言入门系列:数据类型之浮点数

文章目录 一&#xff0c;什么是浮点数二&#xff0c;C语言中的浮点数1&#xff0c;float1.1 float的声明1.2 float的存储格式1.3 float的精度和范围 2&#xff0c;double2.1 double变量的声明2.2 double的存储格式2.3 double的精度和范围2.4 long double 3&#xff0c;0.2 0.1…

uni app 树状结构数据展示

树状数据展示&#xff0c;可以点击item 将点击数据给父组件 &#xff0c;满足自己需求。不喜勿喷&#xff0c;很简单可以根据自己需求改哈&#xff0c;不要问&#xff0c;点赞收藏就好 <template><view><view v-for"(node, index) in treeData" :ke…

Mellanoxnvidia ib高速网络常用命令总结

1.spci&#xff1a;检查本地的pci设备。示例&#xff1a;lspci| grep -i mell 2.ofed_info&#xff1a;检测ofed驱动版本。示例&#xff1a;ofed_info-s 3.ibstat&#xff1a;查看本机的ib网卡状态。 4.mst&#xff1a;mellnoax软件管理工具。用来生成IB设备描述符。提供给其他…

网络新增接入交换机引发故障应对经验

网管对某一栋楼的汇聚交换机进行配置变更&#xff0c;要增加一台接入交换机&#xff0c;因为人员变多了&#xff0c;终端也就变多了&#xff0c;所以现有的网络和接入设备不能满足需求&#xff0c;需要新增一台接入层的交换机。 现网中新增一台接入交换机&#xff0c;这个配置是…

[Day 15] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的數字身份認證 1. 概述 數字身份認證是當今數字世界中的關鍵問題之一。傳統的身份驗證方法面臨著安全性、隱私性和可信度等方面的挑戰。區塊鏈技術通過其去中心化、不可篡改和可追溯的特性&#xff0c;為解決這些問題提供了新的可能性。本文將深入探討區塊鏈在數字身份…

经典游戏案例:unity官方推荐3d跑酷

学习目标&#xff1a;实现跑酷核心算法 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 游戏管理器是一个状态机&#xff0c;根据当前的游戏状态&#xff0c;它…

cJSON解析数组

json串: {"list":[ "hello","world"]} 代码 : int func(char *sn) { int ret = 0; cJSON *root, *list; FILE *fp = fopen("a.txt", "r"); if(!fp) { printf("open sn file failed!\n"); …

图解Attention学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Attention Attention出现的原因是&#xff1a;基于循环神经网络&#xff08;RNN&#xff09;一类的seq2seq模型&#xff0c;在处理长文本时遇到了挑战&#xff0c;而对长文本中…

华北水利水电大学-C程序设计作业

目录 基础题 1-1 分析 代码实现 1-2 分析 代码实现 1-3 分析 代码实现 1-4 ​编辑 分析 代码实现 1-5 分析 代码实现 1-6 分析 代码实现 基础题 1-1 从键盘输入10个学生的有关数据&#xff0c;然后把它们转存到磁盘文件上去。其中学生信息包括学号、姓名…

Redis变慢了?

Redis变慢了&#xff1f; 什么是Redis&#xff1f;测定Redis变慢&#xff1f;最大响应延迟平均响应延迟设置Redis慢日志 分析Redis变慢bigkeysbigkey的危害bigkey优化 写在最后 什么是Redis&#xff1f; 作为一个技术人员来说&#xff0c;大家用的最多的可能就是Redis了&#…