设计模式C++版:第十六式享元模式

享元模式是一种用于性能优化的设计模式,它通过共享大量细粒度对象来减少内存使用。该模式区分内部状态和外部状态,内部状态在享元对象中存储并被认为是不可变的,而外部状态则由客户端对象持有并在需要时传入。这种分离确保了享元对象的高效复用,从而提高系统的运行效率。

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

享元模式:运用共享技术,有效支持大量细粒度的对象。在享元对象内部且不会随环境改变而改变的部分,成为享元对象的内部状态。而随环境改变而改变的,不可以共享的状态称为外部状态。

内部状态,存储在享元对象中;外部状态可以考虑由客户端对象存储和计算,在调用享元对象的时候,传递给享元对象。


#pragma  once
#include <string>
#include <map>
using std::string;
using std::map;

//用户类,网站外部状态
class User
{
public:
	User(string name) :m_username(name)
	{

	}

	string getname()
	{
		return m_username;
	}
private:
	string m_username;
};

//网站抽象
class WebSite
{
public:
	virtual~WebSite(){ }
	virtual  void Use(User user){ }
};


class  ConcreteWebsite :public WebSite
{
public:
	ConcreteWebsite(string name) :m_name(name)
	{

	}

	void Use(User user)override
	{
		printf("网站分类%s,用户名%s\n",m_name.c_str(),user.getname().c_str());
	}

private:
	string m_name;
};

//网站工厂
class  WebsiteFactory 
{
public:
	WebSite* getwebsitecategory(string key)
	{
		std::pair<map<string, WebSite*>::iterator, bool> par;
		if (m_webmap.empty())
		{
			par = m_webmap.insert(std::pair<string, WebSite*>(key, new ConcreteWebsite(key)));
		}
		else
		{
			map<string, WebSite*>::iterator it = m_webmap.find(key);
			if (it != m_webmap.end())
			{
				return it->second;
			}
			par = m_webmap.insert(std::pair<string, WebSite*>(key, new ConcreteWebsite(key)));   //对于这类堆上申请的空间,由在类析构中手动处理
		}

		return par.first->second;
		
	}

	int websitecount()
	{
		return m_webmap.size();
	}


	~WebsiteFactory()
	{
		for (map<string, WebSite*>::iterator iter = m_webmap.begin();iter!=m_webmap.end();++iter)
		{
			delete iter->second;
		}
	}

private:
	map<string,WebSite*> m_webmap;
};


int main()
{
	WebsiteFactory factory;

	WebSite * fx = factory.getwebsitecategory("产品展示");
	User user1("beatsolo");
	fx->Use(user1);

	WebSite * fy = factory.getwebsitecategory("产品展示");
	User user2("apple");
	fy->Use(user2);

	WebSite * fz = factory.getwebsitecategory("博客");
	User user3("个人");
	fz->Use(user3);
	printf("共有%d中网站\n", factory.websitecount());
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值