23种设计模式C++实例之享元模式

本文深入探讨了享元模式的应用,通过享元工厂实现对象共享,有效避免了创建过多临时对象导致的性能开销。通过实例展示了如何在不同场景下复用对象,提升程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 享元模式:通过共享对象来减少创建大量相似对象时的内存消耗。
  • 主要角色:
    • 享元工厂
    • 抽象享元
    • 具体享元
      • 内部状态:享元中存储的状态
      • 外部状态:传递给享元方法的状态
    • 客户端
#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种)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值