- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Net设计模式实例之享元模式(Flyweight Pattern)
/ywqu/archive/2010/01/21/1653087.htmlNet设计模式实例之享元模式( Flyweight Pattern) 一、享元模式简介(Brief Introduction)享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象。Use sharing to support large numbers of fine-grained objects efficiently. 享元模式可以避免大量非常相似类的开销。在程序设计中有时需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本伤都是相同的,有时就能够受大幅度第减少需要实例化的类的数量。如果能把这些参数移到类实例外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。享元对象的内部状态与外部状态:内部状态,在享元对象的内部并且不会随环境改变而改变的共享部分。外部状态,随环境改变而改变的,不可以共享的状态。二、解决的问题(What To Solve)如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销,这时可以考虑使用享元模式。当对象的大多数状态是外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,这时也可以考虑使用享元模式。三、享元模式分析(Analysis)1、享元模式结构?FlyweightFactory类:享元工厂,用来创建和管理Flyweight对象。如果请求的Flyweight对象存在,怎返回已经存在的对象。否则新创建一个新的对象返回。Flyweight类:享元抽象类,通过这个接口,Flyweight可以接受并作用与外部状态。UnsharedConcreteFlyweight类:不需要共享的Flyweight子类。Flyweight接口并不强制共享。ConcreteFlyweight类:实现享元抽象类,为内部状态添加存储空间。2、代码1、享元工厂类FlyweightFactorypublic class FlyweightFactory{ public Hashtable flyweights = new Hashtable();? public FlyweightFactory() { flyweights.Add(A, new ConcreteFlyweight()); flyweights.Add(B, new ConcreteFlyweight()); flyweights.Add(C, new ConcreteFlyweight()); }? public Flyweight GetFlyweight(string key) { return flyweights[key] as Flyweight; }}?2、享元抽象类Flyweight 及其具体实现类UnsharedConcreteFlyweight和ConcreteFlyweightpublic abstract class Flyweight{ public abstract void Operation(int extrinsicstate);}?public class UnsharedConcreteFlyweight:Flyweight{ public override void Operation(int extrinsicstate) { Console.WriteLine({0}:{1},this.GetType().Name,extrinsicstate); }}?public class ConcreteFlyweight:Flyweight{ public override void Operation(int extrinsicstate) { Console.WriteLine({0}:{1}, this.GetType().Name, extrinsicstate); }}?3、客户端代码static void Main(string[] args){ // Arbitrary extrinsic state int extrinsicstate = 20; FlyweightFactory factory = new FlyweightFactory();? // Work with different flyweight instances Flyweight fx = factory.GetFlyweight(A); fx.Operation(--extrinsicstate);? Flyweight fy = factory.GetFlyweight(B); fy.Operation(--extrinsicstate);? F
文档评论(0)