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

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操