享元模式是为了减少内存,减少对象生成的一种设计模式,将与上下文无关的东西提出一个来,而不是每次使用都要去生成一个。
简单示例
#pragma once
#include <iostream>
#include <string>
class StringUtil
{
public:
static StringUtil* Instance()
{
static StringUtil instance;
return &instance;
}
void Trim(std::string&){}
void ToUpper(std::string&){}
void ToLower(std::string&){}
private:
};
class TextA
{
public:
TextA()
{
m_StringUtil = StringUtil::Instance();
}
void DoText(std::string& str)
{
m_StringUtil->Trim(str);
}
private:
StringUtil* m_StringUtil;
};
class TextB
{
public:
TextB()
{
m_StringUtil = StringUtil::Instance();
}
void DoText(std::string& str)
{
m_StringUtil->ToUpper(str);
}
private:
StringUtil* m_StringUtil;
};
StringUtil就是一个享元,虽然TextA、TextB都需要使用它,但是不需要都去new 它,有效减少了内存的分配。再比如地图生成,很多草地格子都是一样的,其实并不需要都去生成它,只需要一个草地实例,其他草地格子只需要引用它即可。