享元模式FlyWeight详解_第1页
享元模式FlyWeight详解_第2页
享元模式FlyWeight详解_第3页
享元模式FlyWeight详解_第4页
享元模式FlyWeight详解_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、享元模式模式描述:享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态和外蕴状态:o 内蕴状态(Internal State)是存储在享元对象内部并且不会随环境改变而改变。因此内蕴状态并可以共享。o 外蕴状态(External State)是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态与内蕴状态是相互独立的。名称:享元模式(Flyweight),Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级"

2、;。这里使用"享元模式"更能反映模式的用意。计算模型: 享元模式可以分为单纯享元模式和复合享元模式:一、 单纯享元模式结构图:单纯享元模式构成说明:1) 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。2) 具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。3) 享元

3、工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。4) 客户端(Client)角色:需要维护一个对所有享元对象的引用;需要自行存储所有享元对象外蕴状态。二、 复合享元模式结构图:复合享元模式构成说明:1) 抽象享元角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外

4、蕴状态(External State)的操作可以通过方法的参数传入。抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。2) 具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。有时候具体享元角色又叫做单纯具体享元角色,因为复合享元角色是由单纯具体享元角色通过复合而成的。3) 复合享元(UnsharableFlyweight)角色:复合享元角色所代表的对象是不可以共享的,但是一个复合享元对

5、象可以分解成为多个本身是单纯享元对象的组合。复合享元角色又称做不可共享的享元对象。4) 享元工厂(FlyweightFactoiy)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象请求一个享元对象的时候,享元工厂角色需要检查系统中是否已经有一个符合要求的享元对象,如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个新的合适的享元对象。5) 客户端(Client)角色:本角色还需要自行存储所有享元对象的外蕴状态。配置约束:享元模式应用的条件如下:1. 一个系统有大量的对象。 2.

6、这些对象耗费大量的内存。 3. 这些对象的状态中的大部分都可以外部化。 4. 这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。 5. 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。 特点:享元模式的优点:   大幅度地降低内存中对象的数量。   享元模式的缺点:   1:享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。   2:享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。   总结: &#

7、160; 享元模式一般是解决系统性能问题的,所以经常用于底层开发,在项目开发中并不常用。不变式:1. 存在一个享元工厂角色,负责创建和管理享元角色。2. 存在一个抽象享元角色,作为所有具体享元类的超类,为这些类规定出需要实现的公共接口。3. 存在一个或多个具体享元角色,实现抽象享元角色所规定的接口。代码:单纯享元模式:/ <summary>    / "Flyweight"    / </summary>  &#

8、160; abstract class Flyweight            / Methods        / <summary>        / 抽象享元对象的商业方法     

9、0;  / </summary>        / <param name="extrinsicstate">外蕴状态</param>        abstract public void Operation(int extrinsicstate);   

10、60;/ <summary>    / "ConcreteFlyweight"    / </summary>    class ConcreteFlyweight : Flyweight            private string

11、60;intrinsicstate = "A"        / Methods        override public void Operation(int extrinsicstate)             

12、;       Console.WriteLine("ConcreteFlyweight: intrinsicstate 0, extrinsicstate 1",intrinsicstate, extrinsicstate);            / <summary>   

13、0;/ "FlyweightFactory"    / </summary>    class FlyweightFactory            / Fields        private Dictionary<strin

14、g, Flyweight> flyweights = new Dictionary<string, Flyweight>();        private static readonly FlyweightFactory instance = new FlyweightFactory();      

15、0; / <summary>        / Constructors        / </summary>        private  FlyweightFactory()        

16、;                          / Methods        / <summary>        / 从享元工厂中生产出

17、一个具体的享元对象        / </summary>        / <param name="key">内蕴状态</param>        / <returns></returns>   

18、0;    public Flyweight GetFlyweight(string key)                    return (Flyweight)flyweightskey);          

19、      / <summary>        / 享元工厂单例方法        / </summary>        / <returns></returns>   

20、0;    public static  FlyweightFactory Singleton()                    return FlyweightFactory.instance;         

21、;        / <summary>        / 向享元工厂对象增加一个享元对象        / </summary>        / <param name="sKey&qu

22、ot;>内蕴状态</param>        / <param name="_Flyweight">具体享元对象</param>        public void AddFlyweight(string sKey, Flyweight _Flyweight)   

23、0;                flyweights.Add(sKey , _Flyweight);                 public Flyweight factory(string sKey) 

24、60;                  if (flyweights.ContainsKey(sKey)                         &#

25、160;  return this.GetFlyweight(sKey);                        else                

26、0;           this.AddFlyweight(sKey, new ConcreteFlyweight();                return this.GetFlyweight(sKey);       

27、                       / <summary>    / 测试代码    / </summary> class Test public static void main()   

28、60; / 初始化外蕴状态值            int extrinsicstate = 22;            /享元工厂对象使用单例            FlyweightF

29、actory f = FlyweightFactory.Singleton ()             /调用过程            /向享元工厂对象请求一个内蕴状态为"X"的单纯享元对象        

30、    Flyweight fx = f.factory("X");            /调用X的商业方法,X的外蕴状态值为21            fx.Operation(-extrinsicstate);    

31、60;       Flyweight fy = f.factory("Y");            fy.Operation(-extrinsicstate);            Flyweight fz =&#

32、160;f.factory("Z");            fz.Operation(-extrinsicstate);public interface Flyweight public void operation(String state);public class ConcerteFlyweight implements Flyweight/内蕴状态private Character intrinsicState = null;/传进来的参数属于外

33、晕状态public ConcerteFlyweight(Character state) rinsicState = state;public void operation(String state) System.out.println("intrinsicState="+intrinsicState+",Extrinsic State="+state);public class FlyweightFactory private HashMap flies = new HashMap();private Flyweight fly;pu

34、blic FlyweightFactory()/字体样式public Flyweight factory(Character state)if(flies.containsKey(state)return (Flyweight)flies.get(state);elsefly = new ConcerteFlyweight(state);flies.put(state, fly);return fly;public class Client public static void main(String args)FlyweightFactory factory=new FlyweightFac

35、tory();Flyweight fly=factory.factory(new Character('a');fly.operation("罗马字符");fly.operation("新罗马字符");fly=factory.factory(new Character('b');fly.operation("阿拉伯字符");复合享元模式:public interface Flyweight public void operation(String state);public class Concrete

36、Flyweight implements Flyweight private Character intrinsicState=null; /构造子,内蕴状态作为参数传入 public ConcreteFlyweight(Character state) rinsicState=state; /外蕴状态作为参数传入方法 public void operation(String state) System.out.println("Intrinsic state="+intrinsicState+",Extrinsic State="+st

37、ate); public class ConcreteCompositeFlyweight implements Flyweight private HashMap flies=new HashMap(10); private Flyweight flyweight; public ConcreteCompositeFlyweight() /增加一个新的单纯享元对象到聚集中 public void add(Character key,Flyweight fly) flies.put(key,fly); /外蕴状态作为参数传入到方法中 public void operation(String e

38、xtrinsicState) Flyweight fly=null; for(Iterator it=flies.entrySet().iterator();it.hasNext();) Map.Entry e=(Map.Entry)it.next(); fly=(Flyweight)e.getValue(); fly.operation(extrinsicState); public class FlyweightFactory private HashMap flies=new HashMap(); public FlyweightFactory() /单纯享元工厂方法,所需状态以参量形式

39、传入 public Flyweight factory(Character state) if(flies.containsKey(state) return (Flyweight)flies.get(state); else Flyweight fly=new ConcreteFlyweight(state); flies.put(state,fly); return fly; /符合享元工厂方法,所需状态以参量形式传入,这个参量巧好可以使用string类型 public Flyweight factory(String compositeState) ConcreteCompositeFl

40、yweight compositeFly=new ConcreteCompositeFlyweight(); int length=compositeState.length(); Character state=null; for(int i=0;i<length;i+) state=new Character(compositeState.charAt(i); System.out.println("factory("+state+")"); compositeFly.add(state,this.factory(state); return

41、compositeFly; public class Client /* * param args */public static void main(String args) FlyweightFactory factory=new FlyweightFactory();Flyweight fly=(Flyweight) factory.factory("abac");fly.operation("罗马字符");/*设计模式-享元模式实现*C+语言*Author:WangYong*/#include <iostream>#include &

42、lt;cassert>#include <vector>#include <string>using namespace std;class Flyweightpublic:virtual Flyweight()virtual void Operation(const string & extrinsicState)string GetIntrinsicState()return this->_intrinsicState;protected:Flyweight(string intrinsicState)this->_intrinsicSta

43、te = _intrinsicState;private:string _intrinsicState;class ConcreteFlyweight:public Flyweightpublic:ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState)cout<<"ConcreteFlyweight Build ."<<intrinsicState<<endl;ConcreteFlyweight()void Operation(const string & extrinsicState)cout<<"ConcreteFlyweight:内蕴"<<this->GetIntrinsicState()<<"ConcreteFlyweight:外蕴"<<extrinsicState<<endl;class FlyweightFactorypublic:FlyweightFactory()FlyweightFactory()Flyweight * GetFlyweight(const string &am

温馨提示

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

评论

0/150

提交评论