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

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 
#include 
#include 
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 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;
}

运行结果:

设计模式(3)--对象结构(6)--享元_第1张图片

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

6.2 Flyweight不强制共享,比如UnsharedFlyweight

 

你可能感兴趣的:(设计模式,设计模式)