设计模式读书笔记:Flyweight(享元)

原创 2015年07月10日 17:17:24

意图:

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

结构图:来自 《23种设计模式 - 郗晓勇》


实现:https://github.com/panshiqu/patterns/tree/master/Flyweight

FlyweightFactory

#include "ConcreteFlyweight.h"
#include <map>

namespace NS_FLYWEIGHT {

class FlyweightFactory {
public:
	FlyweightFactory() {}
	virtual ~FlyweightFactory()
	{
		std::map<int, Flyweight *>::iterator itr = _flyweights.begin();
		for (; itr != _flyweights.end(); itr++)
			delete itr->second;

		_flyweights.clear();
	}
	Flyweight *getFlyweight(int key)
	{
		std::map<int, Flyweight *>::iterator itr = _flyweights.find(key);
		if (itr != _flyweights.end()) return itr->second;

		ConcreteFlyweight *flyweight = new ConcreteFlyweight();
		flyweight->setIntrinsicState(key);

		_flyweights.insert(std::make_pair(key, flyweight));
		return flyweight;
	}

private:
	std::map<int, Flyweight *> _flyweights;
};

} /* namespace NS_FLYWEIGHT */
Flyweight

#include <iostream>

namespace NS_FLYWEIGHT {

class Flyweight {
public:
	Flyweight() {}
	virtual ~Flyweight() {}
	virtual void operation(std::string extrinsicState) = 0;
};

} /* namespace NS_FLYWEIGHT */
ConcreteFlyweight

#include "Flyweight.h"

namespace NS_FLYWEIGHT {

class ConcreteFlyweight : public Flyweight
{
public:
	ConcreteFlyweight() : _intrinsicState(0) {}
	virtual ~ConcreteFlyweight() {}
	virtual void operation(std::string extrinsicState)
	{
		std::cout << extrinsicState << " ConcreteFlyweight - " << _intrinsicState << std::endl;
	}

	void setIntrinsicState(int intrinsicState)	{ _intrinsicState = intrinsicState; }

private:
	int _intrinsicState;
};

} /* namespace NS_FLYWEIGHT */
UnsharedConcreteFlyweight

#include "Flyweight.h"
#include <map>

namespace NS_FLYWEIGHT {

class UnsharedConcreteFlyweight : public Flyweight
{
public:
	UnsharedConcreteFlyweight() {}
	virtual ~UnsharedConcreteFlyweight() {}
	virtual void operation(std::string extrinsicState)
	{
		std::multimap<Flyweight *, std::string>::iterator itr = _flyweights.begin();
			for (; itr != _flyweights.end(); itr++)
			{
				std::string str = itr->second;
				if (str == "") str = extrinsicState;

				itr->first->operation(str);
			}
	}
	virtual void add(Flyweight *flyweight, std::string extrinsicState)
	{
		_flyweights.insert(make_pair(flyweight, extrinsicState));
	}
	virtual void remove(Flyweight *flyweight)
	{
		// do remove
	}

private:
	std::multimap<Flyweight *, std::string> _flyweights;
};

} /* namespace NS_FLYWEIGHT */
main

#include "Flyweight/FlyweightFactory.h"
#include "Flyweight/UnsharedConcreteFlyweight.h"
using namespace NS_FLYWEIGHT;
int main(void)
{
	FlyweightFactory ff;
	UnsharedConcreteFlyweight ucf;
	Flyweight *f1 = ff.getFlyweight(1);
	ucf.add(f1, "");
	Flyweight *f2 = ff.getFlyweight(1);
	ucf.add(f2, "black");
	ucf.operation("red");
}
附加:

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

设计模式读书笔记之享元模式(Flyweight pattern)

享元模式:运用共享技术支持大量细粒度的对象。 记得我年前我读过一次享元模式,当时因为所看的书中的例子不是很好懂,就觉得享元模式无非就是搞个缓冲池保存一些对象然后被共享以免重复创造。 ...

HeadFirst设计模式读书笔记

  • 2008年05月16日 17:20
  • 50KB
  • 下载

设计模式读书笔记----享元模式

面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降。对于这样的问题解决最简单直接的办法就是减少系统中对象的...

设计模式读书笔记-----享元模式

面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降。对于这样的问题解决最简单直接的办法就是减少系统中对象的...
  • chenssy
  • chenssy
  • 2013年09月20日 16:49
  • 6497

《Android源码设计模式解析与实战》读书笔记(二十二)——享元模式

刚开始看到这个模式的名字的时候,还感觉看不懂的样子,以为很难,但是看了它的介绍后就没这么恐惧了。享就是共享,元就是一个单元,也就是对象的意思,所以享元就是共享对象,从这点来看享元模式跟单例模式挺像的,...

设计模式读书笔记-----享元模式

面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降。对于这样的问题解决最简单直接的办法就是减少系统中对象的...

11.java设计模式(读书笔记)享元模式

参考:http://blog.csdn.net/jason0539/article/details/22908915 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不...

《Android源码设计模式》读书笔记 (22) 第22章 享元模式

前言 享元模式是对象池的一种实现,Flyweight,代表轻量级的意思. 享元模式适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多对象的效果,这样一来就可以提升性能,...

设计模式 笔记 享元模式 Flyweight

//---------------------------15/04/20---------------------------- //Flyweight 享元模式---...
  • boydfd
  • boydfd
  • 2015年04月21日 09:06
  • 665
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:Flyweight(享元)
举报原因:
原因补充:

(最多只允许输入30个字)