设计模式(3)--对象结构(6)--享元

本文介绍了享元模式在C++中的应用,包括抽象享元、具体享元和非共享具体享元的角色,以及享元模式如何通过共享技术节省空间。同时提到其优点(如空间节省)和缺点(运行时开销),并展示了相关代码示例和实际运行结果。
摘要由CSDN通过智能技术生成
1. 意图

    运用共享技术有效地支持大量细粒度的对象。

2. 三种角色

    抽象享元(Flyweight)、具体享元(Concrete Flyweight)、具体不共享元(UnShared Concrete Flyweight)、享元工厂(Flyweight Factory)

3. 优点

    3.1 节省空间,共享越多,节省越大

4. 缺点

    4.1 增加了运行时开销 

5. 相关模式 

    5.1 享元模式通常和组合模式结合,用共享叶节点的有向无环图实现一个逻辑上的层次结构

    5.2 通常,最好用享元实现State和Strategy对象。 

6. 代码示意(C++)
#pragma once
#include <iostream>
#include <string>
#include <map>
using namespace std;

class Flyweight
{
protected:
	string m_strName;
public:
	Flyweight(const string& strName) {
		m_strName = strName;
	}
	virtual void operation(int extrinsicState) = 0;
};
class SharedFlyweight :public Flyweight
{
	int intrinsicState;
public:
	SharedFlyweight() :Flyweight("shared"), intrinsicState(2) {
	}
	virtual void operation(int extrinsicState) {
		cout << "I am " << m_strName << endl;
		cout << "ExtrinsicState is " << extrinsicState << endl;
		cout << "IntrinsicState is " << this->intrinsicState << endl;
	}
};
class UnsharedFlyweight :public Flyweight
{
	int m_allState;
public:
	UnsharedFlyweight() :Flyweight("unshared"), m_allState(3) {

	}
	virtual void operation(int extrinsicState) {
		cout << "I am " << m_strName << endl;
		cout << "ExtrinsicState is " << extrinsicState << endl;
		cout << "AllState is " << this->m_allState << endl;
	}
};
class FlyweightFactory
{
	map<string, Flyweight*> m_mapFlyweights;
public:
	~FlyweightFactory() {
		for (auto& pair : m_mapFlyweights) {
			delete pair.second;
		}
		m_mapFlyweights.clear();
	}
	Flyweight* GetFlyweight(const string& name) {
		auto it = m_mapFlyweights.find(name);
		if (it != m_mapFlyweights.end()) {
			cout << "Found shared flyweight" << endl;
			return it->second;
		}
		Flyweight* pFlyweight = 0;
		if (name == "shared") {
			pFlyweight = new SharedFlyweight();
			m_mapFlyweights.emplace(make_pair(name, pFlyweight));
			cout << "Create a shared flyweight" << endl;
		}
		else {
			cout << "Not a shared flyweight" << endl;
		}
		return pFlyweight;
	}

	Flyweight* GetUnsharedFlyweight() {
		return new UnsharedFlyweight();
	}
};
#include "Flyweight.h"
int main() {
	FlyweightFactory* pFactory = new FlyweightFactory();
	Flyweight* pFlyweight = pFactory->GetFlyweight("shared");
	if (0 != pFlyweight) {
		pFlyweight->operation(0);
	}
	pFlyweight = pFactory->GetFlyweight("shared");
	if (0 != pFlyweight) {
		pFlyweight->operation(1);
	}

	pFlyweight = pFactory->GetFlyweight("unshared");
	if (0 == pFlyweight) {
		pFlyweight = pFactory->GetUnsharedFlyweight();
		pFlyweight->operation(1);
		delete pFlyweight;
	}

	delete pFactory;
	return 0;
}

运行结果:

6.1 第二次使用SharedFlyweight时从map里取出,而不需要重新创建(3.1)

6.2 Flyweight不强制共享,比如UnsharedFlyweight

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值