Flyweight享元模式Word下载.docx
- 文档编号:16958681
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:16
- 大小:50.88KB
Flyweight享元模式Word下载.docx
《Flyweight享元模式Word下载.docx》由会员分享,可在线阅读,更多相关《Flyweight享元模式Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
比如在文档编辑器的设计过程中,我们如果为没有字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。
例如一个字母“a”在文档中出现了100000次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同),在这种情况我们可以为将对象的状态分为“外部状态”和“内部状态”,将可以被共享(不会变化)的状态作为内部状态存储在对象中,而外部对象(例如上面提到的字体、大小等)我们可以在适当的时候将外部对象最为参数传递给对象(例如在显示的时候,将字体、大小等信息传递给对象)。
Flyweight的内部状态是用来共享的,Flyweightfactory负责维护一个Flyweight池(存放内部状态的对象),当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经有可适用的,如果有,factory只是简单返回送出这个对象,否则,创建一个新的对象,加入到池中,再返回送出这个对象.池为重复或可共享的对象、属性设置一个缓冲,称为内部状态。
这些内部状态一般情况下都是不可修改的,也就是在第一个对象、属性被创建后,就不会去修改了(否则就没意义了)。
Flyweight对对象的内部状态进行共享,只为每种内部状态创建一个实例,对内部状态使用了单例模式。
用户不应直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到ConcreteFlyweight对象,这可以保证对它们适当地进行共享。
存储节约由以下几个因素决定:
1)因为共享,实例总数减少的数目
2)
对象内部状态的平均数目
3)外部状态是计算的还是存储的
实现要点
1)享元工厂维护一张享元实例表。
2)享元不可共享的状态需要在外部维护。
即删除外部状态:
该模式的可用性在很大程度上取决于是否容易识别外部状态并将它从共享对象中删除。
3)按照需求可以对享元角色进行抽象。
4)管理共享对象:
引用计数和垃圾回收……
何时采用
1)如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;
2)还有就是对象的大多数状态可变为外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑所使用享元模式。
3)系统中有大量耗费了大量内存的细粒度对象,并且对外界来说这些对没有任何差别的(或者说经过改造后可以是没有差别的)。
在文档编辑器例子中如果一个字符对应一个对象,那么一篇文档所要容纳的对象将是非常的庞大耗费大量的内存。
而实际组成文档的字符是有限的,是由这些字符不同的组合和排列得到的。
所以需要共享,将基本的字符进行共享,将使得字符对象变得有限。
代码如下:
Flyweight.h
1#ifndef_FLYWEIGHT_H_
2#define_FLYWEIGHT_H_
3
4#include<
string>
5#include<
vector>
6
7usingnamespacestd;
8
9//基类,定义操作接口Operation
10classFlyweight
11{
12public:
13//操作外部状态extrinsicState
14virtualvoidOperation(conststring&
extrinsicState)=0;
15stringGetIntrinsicState();
16virtual~Flyweight();
17protected:
18Flyweight(stringintrinsicState);
19private:
20//内部状态,也可以放在ConcreteFlyweight中
21string_intrinsicState;
22};
23
24classConcreteFlyweight:
publicFlyweight
25{
26public:
27//实现接口函数
28virtualvoidOperation(conststring&
extrinsicState);
29ConcreteFlyweight(stringintrinsicState);
30~ConcreteFlyweight();
31};
32
33classUnsharedConcreteFlyweight:
34{
35public:
36virtualvoidOperation(conststring&
37UnsharedConcreteFlyweight(stringintrinsicState);
38~UnsharedConcreteFlyweight();
39};
40
41classFlyweightFactory
42{
43public:
44FlyweightFactory();
45~FlyweightFactory();
46//获得一个请求的Flyweight对象
47Flyweight*GetFlyweight(stringkey);
48//获取容器中存储的对象数量
49voidGetFlyweightCount();
50protected:
51private:
52//保存内部状态对象的容器
53vector<
Flyweight*>
m_vecFly;
54};
55#endif
Flyweight.cpp
1#include"
Flyweight.h"
2#include<
iostream>
4usingnamespacestd;
5
6Flyweight:
:
Flyweight(stringintrinsicState)
7{
8this->
_intrinsicState=intrinsicState;
9}
10
11Flyweight:
~Flyweight()
12{}
13
14stringFlyweight:
GetIntrinsicState()
15{
16returnthis->
_intrinsicState;
17}
18
19ConcreteFlyweight:
ConcreteFlyweight(stringintrinsicState):
Flyweight(intrinsicState)
20{
21}
22
23ConcreteFlyweight:
~ConcreteFlyweight()
24{
25}
26
27voidConcreteFlyweight:
Operation(conststring&
extrinsicState)
28{
29cout<
<
this->
GetIntrinsicState()<
endl;
30cout<
extrinsicState<
31}
33UnsharedConcreteFlyweight:
UnsharedConcreteFlyweight(stringintrinsicState):
35}
36
37UnsharedConcreteFlyweight:
~UnsharedConcreteFlyweight()
38{
39}
41voidUnsharedConcreteFlyweight:
43cout<
"
extrinsicState"
<
44}
45
46FlyweightFactory:
FlyweightFactory()
47{}
48
49FlyweightFactory:
~FlyweightFactory()
50{}
51
52//若该对象已存在,直接返回,否则新建一个对象,存入容器中,再返回
53Flyweight*FlyweightFactory:
GetFlyweight(stringkey)
54{
55vector<
iteratoriter=this->
m_vecFly.begin();
56for(;
iter!
=this->
m_vecFly.end();
iter++)
57{
58if((*iter)->
GetIntrinsicState()==key)
59{
60return*iter;
61}
62}
63Flyweight*fly=newConcreteFlyweight(key);
64this->
m_vecFly.push_back(fly);
65returnfly;
66}
67
68voidFlyweightFactory:
GetFlyweightCount()
69{
70cout<
m_vecFly.size()<
71}
main.cpp
3#include<
4
5usingnamespacestd;
7intmain()
8{
9//外部状态extrinsicState
10stringextrinsicState="
ext"
;
11
12//工厂对象,工厂对象
13FlyweightFactory*fc=newFlyweightFactory();
14
15//向工厂申请一个Flyweight对象,且该对象的内部状态值为“hello”
16Flyweight*fly=fc->
GetFlyweight("
hello"
);
17
18Flyweight*fly1=fc->
19
20//应用外部状态
21fly->
Operation(extrinsicState);
23fc->
GetFlyweightCount();
24
25return0;
26}
另外一个文本处理的例子
参考:
Document.h
1#ifndef_DOCUMENT_H_
2#define_DOCUMENT_H_
9//The'
Flyweight'
abstractclass
10classcharacter
13//析构函数
14virtual~character();
15//应用外部状态
16virtualvoidDisplay(intwidth,intheight,intascent,intdescent,intpointSize)=0;
17//获取内部状态
18virtualcharGetSymbol()=0;
19protected:
20/*-----内部状态---------*/
21charsymbol;
22/*----------------------/
24/*-----外部状态---------*/
25intwidth;
26intheight;
27intascent;
28intdescent;
29intpointSize;
30/*----------------------*/
31//构造函数
32character(charc);
33};
34
35//A'
ConcreteFlyweight'
class
36classcharacterA:
publiccharacter
37{
38public:
39characterA(charc);
40~characterA();
41virtualvoidDisplay(intwidth,intheight,intascent,intdescent,intpointSize);
42virtualcharGetSymbol();
43protected:
44private:
45};
46
47//B'
48classcharacterB:
49{
50public:
51characterB(charc);
52~characterB();
53virtualvoidDisplay(intwidth,intheight,intascent,intdescent,intpointSize);
54protected:
55private:
56};
57
58//C'
59classcharacterC:
60{
61public:
62characterC(charc);
63~characterC();
64virtualvoidDisplay(intwidth,intheight,intascent,intdescent,intpointSize);
65protected:
66private:
67};
68
69//D'
70classcharacterD:
71{
72public:
73characterD(charc);
74~characterD();
75virtualvoidDisplay(intwidth,intheight,intascent,intdescent,intpointSize);
76protected:
77private:
78};
79/*
80...
81*/
82
83//The'
FlyweightFactory'
84classcharacterFactory
85{
86public:
87characterFactory();
88~characterFactory();
89//申请一个character对象
90character*GetCharacter(char);
91//获取存储的character*数量
92vector<
character*>
size_typeGetCount();
93private:
94//保存character*的容器,可以换成List等其它容器
95vector<
m_vecCharacter;
96};
97
98#endif
Document.cpp
Document.h"
4character:
character(charc)
5{
6this->
symbol=c;
7}
9character:
~character()
10{
11}
12
13characterA:
characterA(charc):
character(c)
14{
15}
16
17characterA:
~characterA()
18{
19}
20
21charcharacterA:
GetSymbol()
22{
23returnthis->
symbol;
24}
25
26voidcharacterA:
Display(intwidth,intheight,intascent,intdescent,intpointSize)
27{
28//接收并作用外部状态
29this->
ascent=ascent;
30this->
descent=descent;
31this->
height=height;
32this->
pointSize=pointSize;
33this->
width=width;
35cout<
symbol<
"
36<
ascent<
37<
descent<
38<
height<
39<
pointSize<
40<
width<
41}
42
43characterFactory:
characterFactory()
44{}
46characterFactory:
~characterFactory()
49character*characterFactory:
GetCharacter(charc)
50{
51vector<
m_vecCharacter.begin();
52for(;
iter!
m_vecCharacter.end();
53{
54if((*iter)->
GetSymbol()==c)
55{
56return*iter;
57}
58}
59character*pf=newcharacterA(c);
60this->
m_vecCharacter.push_back(pf);
61returnpf;
63
64vector<
size_typecharacterFactory:
GetCount()
65{
66returnthis->
m_vecCharacter.size();
67}
2#include"
6usingnamespacestd;
7
8intmain()
9{
10//存储外部状态
11intascent=70;
12intdescent=0;
13intheight=100;
14intwidth=120;
15intpointSize=10;
17stringtest="
AABCDDEFGHI"
18string:
iteratorit=test.begin();
19c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Flyweight 模式
![提示](https://static.bdocx.com/images/bang_tan.gif)