设计模式观后(c++还原之二十五 享元模式)

本文介绍了一种软件设计模式——享元模式,通过实例展示了如何利用该模式减少内存消耗。通过对报考系统的模拟,实现了多个用户共享同一块内存的目标,从而有效提升了系统的资源利用率。

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

string int2string(int n) {
	char buffer[10] = {0};
	_itoa_s(n, buffer, 10, 10);
	return string(buffer);
}
//享元模式
//作者例子:报考系统的对象
//每个用户的访问就构造一个对象会导致内存不够,作者设立关键字:多个用户使用一块内存
//报考信息
class SignInfo {
private:
	string m_strID;//报名的ID
	string m_strLocation;//考试地点
	string m_strSubject;//考试科目
	
public:
	string GetID() {return m_strID;}
	void SetID(string id) {m_strID = id;}

	string GetLocation() {return m_strLocation;}
	void SetLocation(string location) {m_strLocation = location;}

	string GetSubject() {return m_strSubject;}
	void SetSubject(string subject) {m_strSubject = subject;}
};
//带对象池的报考信息
class SignInfoPool : public SignInfo {
	//定义对象池的key
private:
	string m_strKey;
public:
	SignInfoPool(string key) {
		m_strKey = key;
	}
	string GetKey() {
		return m_strKey;
	}
	void SetKey(string key) {
		m_strKey = key;
	}
};
//对象池的工厂类
class SignInfoFactory {
private:
	//池容器
	static map<string, SignInfo*> s_pool;
public:
	static SignInfo* SignInfo() {
		return new class SignInfo;
	}
	//从线程池获取对象
	static class SignInfo* GetSignInfo(string key) {
		class SignInfo* result = NULL;
		//池中没有对象,则建立,并放入。有就返回
		if (s_pool.find(key) != s_pool.end()) {
			cout << "直接从池中取出" <<endl;
			result = s_pool[key];
		} else {
			cout << "建立对象,放置池中" << endl;
			result = new SignInfoPool(key);
			s_pool.insert(make_pair(key, result));
		}
		return result;
	}
};
map<string, SignInfo*> SignInfoFactory::s_pool;

class Client {
public:
	static void main() {
		//初始化对象池
		for (int i = 0; i < 4; i++)
		{
			string subject = "科目" + int2string(i);
			for (int j = 0; j < 3; j++)
			{
				string key = subject + "考试地点";
				key += int2string(j);
				cout << key <<":";
				SignInfoFactory::GetSignInfo(key);
			}
		}
		SignInfo* p_signinfo = SignInfoFactory::GetSignInfo("科目1考试地点1");
	}
};
//key值是唯一的,作者根据这个而建立对象
//通过唯一值访问对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值