设计模式读书笔记: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");
}
附加:
版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA设计模式之享元模式

解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象...
  • jason0539
  • jason0539
  • 2014年04月04日 07:34
  • 31521

C++设计模式13----Flyweight享元模式

Flyweight享元模式概述 作用:运用共享技术有效地支持大量细粒度的对象。 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intri...
  • gatieme
  • gatieme
  • 2015年02月09日 20:46
  • 12055

浅谈JAVA设计模式之——享元模式(Flyweight)

一、概述 运用共享技术有效地支持大量细粒度的对象。 二、适用性 当都具备下列情况时,使用Flyweight模式:        1.一个应用程序使用了大量的对象。        2.完全由于使用大...
  • l1028386804
  • l1028386804
  • 2015年05月07日 23:46
  • 1670

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

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

Flyweight(享元)设计模式

一、概念         运用共享技术,有效地支持大量细粒度的对象。减少内存消耗。它有两个状态:        内部状态:存储在享元对象内部,并且不会随环境改变而改变的对象,可以共享。        ...
  • Sharing_Li
  • Sharing_Li
  • 2015年12月04日 16:48
  • 380

设计模式——享元FlyWeight

运用共享技术有效地支持大量细粒度的对象。这是GOF的设计模式里的原话。关键点: 细粒度(使用前需要考虑是否有这个必要),大量(运用共享解决这个可能存在的问题)。怎么共享:首先将对象属性切分成内外部2份...
  • Dancing_lover
  • Dancing_lover
  • 2010年10月27日 23:19
  • 277

Integer注意_享元设计模式

public class IntegerNote{  public static void main(String[] args){   Integer d1=100;   Integer d2...
  • user_longling
  • user_longling
  • 2013年10月05日 23:04
  • 647

基本类型Integer的享元设计模式

相信大家都知道,jdk5是java语言改变最大的一个jdk版本,它新加入的一个自动拆装箱的特性是我们java程序员方便了很多,使得基本类型int与java类型Integer基本上没有了什么区别,不需要...
  • xlinsist
  • xlinsist
  • 2014年11月02日 19:35
  • 789

Java设计模式——享元模式

在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。...
  • u013761665
  • u013761665
  • 2016年04月25日 13:35
  • 11064

C# 设计模式-享元(Flyweight)

使用共享技术支持大量细粒度的对象主要组成: FlywieghtFactory-享元工厂,复制创建和管理享元对象 Flyweight-享元父类或接口 ConcreteFlyweight-具体享元对...
  • m0_37862405
  • m0_37862405
  • 2018年01月01日 21:26
  • 62
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:Flyweight(享元)
举报原因:
原因补充:

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