C++中的享元模式

2024-06-11 16:36
文章标签 c++ 模式 享元

本文主要是介绍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;
}

总结

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

这篇关于C++中的享元模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051699

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程