C++享元模式(Flyweight)

UML类图(仅供参考)如下:

享元模式解决的问题:

主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。运用共享技术有效地支持大量细粒度的对象。在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

源码

#include <iostream>
#include <string>
#include <vector>

// 基类,定义操作接口Operation
class CFlyweight
{
public:

	//操作外部状态extrinsicStatus
	virtual void Operation(const std::string& extrinsicStatus) = 0;

	std::string GetIntrinsicStatus()
	{
		return _intrinsicStatus;
	}

	virtual ~CFlyweight() {}

protected:

	CFlyweight(std::string intrinsicStatus) :_intrinsicStatus(intrinsicStatus) {}

private:

	//内部状态,也可以放在ConcreteFlyweight中
	std::string _intrinsicStatus;
};

// 需要共享的类
class CConcreteFlyweight :public CFlyweight
{
public:

	CConcreteFlyweight(std::string intrinsicStatus) :CFlyweight(intrinsicStatus) {}

    //实现接口函数
	virtual void Operation(const std::string& extrinsicStatus)
	{
		std::cout << GetIntrinsicStatus() << std::endl;
		std::cout << extrinsicStatus << std::endl;
	}
};

// 不需要共享的类
class CUnsharedConcreteFlyweight :public CFlyweight
{
public:

	CUnsharedConcreteFlyweight(std::string intrinsicStatus) :CFlyweight(intrinsicStatus) {}

	//实现接口函数
	virtual void Operation(const std::string& extrinsicStatus)
	{
		std::cout << GetIntrinsicStatus() << std::endl;
		std::cout << extrinsicStatus << std::endl;
	}
};

class CFlyweightFactory
{
public:

	~CFlyweightFactory()
	{
		for (auto iter = m_vecFly.begin(); iter != m_vecFly.end(); ++iter)
		{
			delete *iter;
		}
		m_vecFly.clear();
	}

     //获得一个请求的Flyweight对象
	CFlyweight* GetFlyweight(std::string key)
	{
		for (auto iter = m_vecFly.begin(); iter != m_vecFly.end(); ++iter)
		{
			if ((*iter)->GetIntrinsicStatus() == key)
			{
				return (*iter);
			}
		}

		CFlyweight *fly = new CConcreteFlyweight(key);
		m_vecFly.push_back(fly);
		return fly;
	}

    //获取容器中存储的对象数量
	void GetFlyweightCount()
	{
		std::cout << m_vecFly.size() << std::endl;
	}

private:

    //保存内部状态对象的容器
    std::vector<CFlyweight*> m_vecFly;
};

int main()
{
	//外部状态extrinsicStatus
	std::string extrinsicStatus = "ext";
	
	//工厂对象
	CFlyweightFactory *fc = new CFlyweightFactory();
	
	//向工厂申请一个Flyweight对象,且该对象的内部状态值为“hello”
	CFlyweight *fly1 = fc->GetFlyweight("hello");
	CFlyweight *fly2 = fc->GetFlyweight("hello");
	
	//应用外部状态
	fly2->Operation(extrinsicStatus);
	
	fc->GetFlyweightCount();
	
	return 0;
}

好处

大大减少对象的创建,降低系统的内存,使效率提高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值