简单的享元模式。
1. 情景与意图
假设我们每次去写作业的时候,都去买一支笔,那么文具盒总会有撑爆的一天。另外常量字符串我们都知道在创建后,及时生命周期结束,也并不会立即被销毁,而是还是存在内存中,当下次使用的时候,直接拿到就可以。
在日常开发中,如果我们在使用某些细腻度较高的对象时候,都去创建,内存总会有还没有及时销毁的对象,但是依旧占着内存。因此我们需要一种设计来解决这个问题。
2. 享元模式
运用共享技术有效地支持大量细粒度的对象。主要用于减少创建对象的数量,以减少内存占用和提高性能。
下面用一个简单的图片存储来实现一下享元模式。
3. 图片id
场景就是:当我们已经创建过一张图片了,就不再创建,需要使用该图片的时候直接使用,如果没有,此时我们创建一张图片。
首先我们创建图片类:
class DPImage {
std::string _imageMessage;
public:
DPImage(std::string message = std::string(""));
void showMessage();
};
然后创建图片管理类:
// .h
#include "DPImage.h"
#include <unordered_map>
class DPImageManager {
std::unordered_map<std::string, DPImage> _imageMap;
public:
DPImageManager();
DPImage getImage(std::string imageID);
};
// .cpp
// 细节实现
DPImage DPImageManager::getImage(std::string imageID) {
std::unordered_map<std::string, DPImage>::iterator item = _imageMap.find(imageID);
// 此时我们没有创建过该图片
if (item == _imageMap.end()) {
_imageMap[imageID] = DPImage(imageID);
}
return _imageMap[imageID];
}
最后使用一下:
int main() {
DPImage image = DPImageManager().getImage(std::string("风景"));
image.showMessage();
return 0;
}
4. 大总结
享元模式和单例模式在理解上都是比较简单的,在日常开发中用的也是比较多的。它们都属于一类——“对象性能”模式。
面向对象的开发方式带来了抽象的好处,但是在某些情况下也付出了相应的创建对象或者性能相关代价,享元模式与单例模式在对象性能方面表现的更为强烈,降低了该方面的影响、
享元模式代码:【享元模式代码】