第12章-享元模式.ppt_第1页
第12章-享元模式.ppt_第2页
第12章-享元模式.ppt_第3页
第12章-享元模式.ppt_第4页
第12章-享元模式.ppt_第5页
免费预览已结束,剩余45页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第12章,始终权/轻量模式(Flyweight),提问,围棋棋盘共361个,棋子361个。现在要实现一个围棋程序该怎么办?然后定义成员变量,该变量定义棋盘类,包括棋子的颜色、形状和位置等信息。成员变量包含用于保存棋子的容器,问题,棋盘的容器包含下面的兵,每个兵包含棋子的所有属性。一盘围棋通常需要包括数百颗棋子,采用上述实现将占用太多空间。如何改善呢?分割、兵对象:具有独特的特性,如颜色、图形等。也可以共享外部属性(例如棋盘上的位置内部属性),区分外部属性,重新创建新计划,定义两个棋盘的对象、黑棋、白棋等。两个对象都包含棋盘的内部属性兵的外部属性。这意味着您可以提取棋盘的位置,并将其保存在单独的

2、容器中。上一个方案现在容器仅具有位置属性,并且是原始平铺对象。当前方案大大减少了对空间的需求,享受元模式定义,使用共享技术高效地重用大量精细对象。系统只使用少量对象,它们都相似,状态变化很小,可以多次重复使用对象。可共享对象必须是粒度对象,因此也称为轻量级模式,这可能会导致对象结构模式、元模式同步、系统中的对象数过多、执行成本过高以及性能降低等问题。娱乐模式就是为了解决这类问题而诞生的。共享技术允许重复使用相同或相似的对象。可以在实体模式下共享的相同内容称为内部状态,需要设置外部环境的非共享内容称为外部状态。设定不同的外部状态可让相同的物件具有不同的性质,相同的内部状态可以共用,内部状态不受环

3、境影响。外部状态随环境的变化而变化。由于外部状态不能影响内部状态,并且彼此独立实际使用和共享的内部状态有限,因此福利元对象通常设计为较小的对象(称为微调对象)。元模式的目的是使用共享技术重复使用多个精细对象。大大减少了实体模式、实体模式,内存中的对象数在实体模式下经常发生工厂模式,需要创建用于维护同一内部状态下的实体对象的实体池的实体工厂。基本模式、简单基本模式UML和所有实体对象都是可共享的:也就是说,您可以共享没有特定不共享实体的所有抽象基元类的子类。抽象实体(Flyweight)角色:此接口flyweight可以接受外部状态并对其进行操作。通过此接口传递外部状态后,这些外部数据可用于元对

4、象的方法处理。特定元素角色:特定元素实现对象必须是可共享的,封装flyweight的内部状态,元素工厂(FlyweightFactory)角色:负责创建和管理元素对象。必须确保实体对象可以在系统中正确共享。在客户端对象中调用实体对象时,实体角色检查系统中是否已存在复合所需的实体对象。如果已存在,则共享工厂角色必须提供此现有共享目标。如果系统中没有相应的实体对象,则实体角色必须创建相应的实体对象。实体对象可以在HashMap客户端(Client)角色中将内部状态存储为关键字。这个角色需要提供实体对象的外部状态,娱乐模式的核心是娱乐类。当用于存储实体对象的容器用户需要对象时,首先从实体获取对象,如

5、果该对象不在容器池中,则创建新的实体对象,将其返回给用户,然后将新对象存储在实体池中。public abstract class flyweight/methodspublicabstracctvoidoperation(intrtextrinsicstate);public class concrete flyweight textends flyweighttprivatestringintrinscstate=a;/methodspublicvoidoperation(intrtextrinsicstate)system . out . print ln(intrinsic state

6、. tostring()system . on,public classflyweightfactoryprivatehasrhmaplyweights=new hash map();publicflyweightfactory()fly weights . put(x,newconcretflyweight();Flyweights.put (y,newconcretflyweight();Flyweights.put (z,newconcretflyweight();/methodspublicflyweightetflyweight(string key)return(fly weigh

7、t)fly weights . get(key);publicclassflyweightclient ublicstationcvoidmin(string args)int exrinsic state=21、22、23、24、25;flyweightfactoryf=newflyweighttfactory();/workwithterentflyweightingstancesflyweighttfx 1=f . get flyweight(x);Fx .fx .operation(extrinsic state 0);flyweight FX 2=f . get flyweight(

8、X);Fx .fx .operation(extrinsic state 3 3);flyweightfy=f . get flyweight(Y);Fy。fy。operation(extrinsic state 1 1);flyweightfz=f . get flyweight(Z);Fz .fz .operation(extrinsic state 2 2);复合实体模式UML,该模式使用合成模式合成一些简单实体,以形成复合实体对象。复合对象本身不能共享,但可以分解为可以共享简单对象的简单对象。复合持续模式的UML,抽象共享角色:与简单共享模式不同,子类对象不能共享。特定优惠角色:此角色

9、对象,是系统在合成模式下可共享的最下级对象。复合福利角色:复合福利角色所代表的物件不能共用,但复合福利物件可以复合为多个特定福利物件。共享工厂角色(shared factory role):像简单共享模式下的共享工厂角色一样,负责创建和管理共享对象。客户端角色:直接存储所有实体对象的外部状态。,/抽象共享角色abstract public class flyweight abstract public void operation(string state);/特定元素(ConcreteFlyweight)角色public class concrete flyweight extends fl

10、yweight private character intrinsic state=null;public concrete flyweight(character state)rinsic state=statepublic void operation(string state)system . out . print(ninternal state=intrins state exrinsic state=state);/复合实体(UnsharableFlyweight)角色public类concretentifieldflyweight private hash map

11、 flies=new hash map(10);Private Flyweight flyweightpublic concretentinpeight()public void add(character key,flyweight flies.put (key,fly);public void operation(string exrinsic state)flyweight fly=null;For (iterator it=flies.entryset()。iterator();it . has next();)Map。Entry e=(Map .entry)it . next();f

12、ly=(Flyweight)e . get value();fly . operation(extrinsic state);factory角色public class flyweight factory private hash map flies=new hash map();Private Flyweight lnkFlyweightpublic flyweight factory()public flyweight factory(string composite)concrete composite lyweight composite fly=new conconconcretei

13、nt length=composite estate . length();Character state=nullfor(int I=0);I lengthI)state=new character(composite estate . charat(I);System.out.println(工厂);Composite fly.add (state,this . factory(state);Return compositeFly,public flyweight factory(character state)if(flies)。contains key(state)return(fly

14、weight)flies . get(state);else flyweight fly=new concrete flyweight(state);Flies.put(state,fly);Return flypublic void check flyweight()flyweight fly;int I=0;system . out . print ln(n=check flyweight()=);For (iterator it=flies.entryset()。iterator();it . has next();)Map。Entry e=(Map .entry)it . next()

15、;system . out . print ln(item(I): e . getkey();system . out . print ln(n=check flyweight()=);/客户端角色public class Client private static flyweight factory;public static void main(string args)factory=new flyweight factory();Flyweight fly/* fly=factory . factory(new character(a);fly . operation();fly=fac

16、tory . factory(new character(b);fly . operation();fly=factory . factory(new character(a);fly . operation();*/fly=factory . factory(ABC);fly . operation(Composite Call);/intrinsic flyweight factory . check flyweight();由于数据库连接池、元模式共享特性,因此可用于所有池中的操作,如线程池和数据库连接池。数据库连接池是共享模式下的典型应用程序。该应用程序需要连接池工厂类ConnectP

17、ool,该工厂类聚合多个连接连接(例如flyweight pattern on integer object),Java : integer I=13Integer j=13Integer i1=137Integer J1=137system . out . print ln(I=j);/true system . out . print ln(i1=J1);/false,在Java中使用1字节以内的数字时,缓存以供重复使用。Java:字符串c=HelloString d=Hellosystem . out . print ln(c=d);String a=new String(Hello);String b=new String(Hello);system . out . print ln(a=b);示例(Flywei

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论