- 享元模式:通过共享对象来减少创建大量相似对象时的内存消耗。
- 主要角色:
- 享元工厂
- 抽象享元
- 具体享元
- 内部状态:享元中存储的状态
- 外部状态:传递给享元方法的状态
- 客户端
#include <iostream>
#include <map>
using namespace std;
/*
* 享元模式
* 享元:共享元素
* 以共享的方式来避免大量拥有相同内容对象的开销
* 理解:
* 对于经常使用且仅参数不同的对象,不是每次都重新创建一个不同的对象,
* 而是创建一个对象之后,每次使用时传入不同的参数
* 外部状态:外部改变
* 内部状态:内部常量,不变
* */
// 享元:内部状态
class TreeModel {
public:
TreeModel(string mid)
{
m_modelId = mid;
}
private:
string m_modelId;
};
// 享元工厂:单例,缓存已创建的享元
class TreeModelFactory {
private:
TreeModelFactory() {
m_map.clear();
}
public:
~TreeModelFactory() {
while (!m_map.empty()) {
map<string, TreeModel*>::iterator it = m_map.begin();
TreeModel* p = it->second;
m_map.erase(it);
delete p;
}
}
static TreeModelFactory* getInstance() {
if (m_instance == NULL) {
m_instance = new TreeModelFactory();
}
return m_instance;
}
static void freeInstance() {
if (m_instance != NULL) {
delete m_instance;
m_instance = NULL;
}
}
TreeModel* getTreeModel(string id) {
map<string, TreeModel*>::iterator it = m_map.find(id);
if (it == m_map.end()) {
TreeModel* tmp = new TreeModel(id);
m_map.insert(pair<string, TreeModel*>(id, tmp));
return tmp;
}
return it->second;
}
private:
static TreeModelFactory* m_instance;
map<string, TreeModel*>m_map;
};
TreeModelFactory* TreeModelFactory::m_instance = NULL;
// 变量:外部状态
struct Position
{
int x;
int y;
};
class Tree {
public:
Tree(string mid, int x, int y)
{
TreeModelFactory* factory = TreeModelFactory::getInstance();
model = factory->getTreeModel(mid);
pos.x = x;
pos.y = y;
}
private:
// 内部状态
TreeModel* model;
// 外部状态
Position pos;
};
int main() {
string mid1 = "mod_001.fbx";
Tree* t1_1 = new Tree(mid1, 10, 10);
Tree* t1_2 = new Tree(mid1, 110, 110);
string mid2 = "mod_002.fbx";
Tree* t2_1 = new Tree(mid2, 20, 20);
Tree* t2_2 = new Tree(mid2, 210, 210);
return 0;
}
创建模式(5种)
结构模式(7种)
行为模式(11种)