14设计模式享元模式(Flyweight).ppt_第1页
14设计模式享元模式(Flyweight).ppt_第2页
14设计模式享元模式(Flyweight).ppt_第3页
14设计模式享元模式(Flyweight).ppt_第4页
14设计模式享元模式(Flyweight).ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、设计模式(Design Pattern),张凯 副教授 计算机学院 软件工程系,问题(Problem),问题(Problem),用户越来越多,可服务器却宕机了,问题(Problem),你程序是怎么写的,占用那么内存,问题(Problem),两个解决办法,问题(Problem),问题(Problem),问题(Problem),服务器 65535,如何设计能有效减少系统开销?,问题(Problem),斗地主类,麻将类,问题(Problem),class Game /游戏 private string name = ; public Game(string name) = nam

2、e; public void Play() Console.WriteLine(运行游戏: + name); ,问题(Problem),static void Main(string args) Game zs = new Game(斗地主); zs.Play(); Game ls = new Game(斗地主); ls.Play(); Game ww = new Game(斗地主); ww.Play(); Game zl = new Game(麻将); zl.Play(); Game sq = new Game(麻将); sq.Play(); Game zb = new Game(麻将);

3、zb.Play(); Console.Read(); ,三个斗地主实例,本质都是一样的代码,但是随着用户增多,实例也会增多,对服务器资源造成浪费,希望共享代码,主要内容,享元模式(Flyweight),模式动机 模式名称:享元模式(Flyweight) 享元模式对那些通常因为数量太大而难以用对象来表示的概念或实体进行建模。 如为字母表中的每一个字符创建一个享元,每个享元对象存储一个字符代码。逻辑上,文档中的给定字符每次出现都有一个对象与其对应,然而物理上相同的字符共享一个享元对象,而这个对象可以出现在文档结构的不同地方。,享元模式(Flyweight),模式动机 由于不同的字符对象数远小于文档

4、中的字符数,因此,对象的总数远小于一个 初次执行的程序所使用的对象数目。对于一个所有字符都使用同样的字体和颜 色的文档而言,不管这个文档有多长,只需要分配100个左右的字符对象(大 约是ASCII字符集的数目)。由于大多数文档使用的字体颜色的组合不超过10 种,实际应用中这一数目不会明显增加。因此,对单个字符进行对象抽象是具有实际意义的。,享元模式(Flyweight),模式定义 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。 系统只使用少量的对象,而这些对象都很近,状态变化很小,对象使用次数增多。享元模式是一种对象结构型模式。,享元模式(Flyweight),abs

5、tract class Game /游戏 public abstract void Play(); /具体的游戏 class ConcreteGame : Game private string name = ; public ConcreteGame(string name) = name; public override void Play() Console.WriteLine(运行游戏: + name); ,享元模式(Flyweight),class GameFactory /游戏工厂 private Hashtable flyweights = new Hasht

6、able(); /获得游戏分类 public Game GetGameCategory(string key) if (!flyweights.ContainsKey(key) flyweights.Add(key, new ConcreteGame(key); return (Game)flyweightskey); /获得游戏分类总数 public int GetGameCount() return flyweights.Count; ,享元模式(Flyweight),static void Main(string args) GameFactory f = new GameFactory

7、(); Game zs = f.GetGameCategory(斗地主); zs.Play(); Game ls = f.GetGameCategory(斗地主); ls.Play(); Game ww = f.GetGameCategory(斗地主); ww.Play(); Game zl = f.GetGameCategory(麻将); zl.Play(); Game sq = f.GetGameCategory(麻将); sq.Play(); Game zb = f.GetGameCategory(麻将); zb.Play(); Console.WriteLine(游戏逻辑总数为 0,

8、f.GetGameCount(); Console.Read(); ,享元模式(Flyweight),享元模式(Flyweight),内部状态与外部状态 实现了享元模式共享的目的,无论几个用户,运行游戏一样,就只保留一个游戏逻辑代码。 但是,这些用户毕竟不是同一个用户,用户名不同,用户的牌也不同。 我们称享元对象内部不随环境变化的共享部分称为内部状态。 而随环境而改变,不可以共享的称为外部状态。,享元模式(Flyweight),享元模式(Flyweight),/用户 public class User private string name; public User(string name)

9、 = name; public string Name get return name; ,享元模式(Flyweight),abstract class Game /游戏 public abstract void Play(User user); /具体的游戏 class ConcreteGame : Game private string name = ; public ConcreteGame(string name) = name; public override void Play(User user) Console.WriteLine(运行游戏

10、: + name + 用户: + user.Name); ,享元模式(Flyweight),static void Main(string args) GameFactory f = new GameFactory(); Game zs = f.GetGameCategory(斗地主); zs.Play(new User(张三); Game ls = f.GetGameCategory(斗地主); ls.Play(new User(李四); Game ww = f.GetGameCategory(斗地主); ww.Play(new User(王五); Game zl = f.GetGameCa

11、tegory(麻将); zl.Play(new User(赵六); Game sq = f.GetGameCategory(麻将); sq.Play(new User(孙七); Game zb = f.GetGameCategory(麻将); zb.Play(new User(周八); Console.WriteLine(游戏逻辑总数为 0, f.GetGameCount(); Console.Read(); ,享元模式(Flyweight),模式结构,享元模式(Flyweight),模式结构,享元模式(Flyweight),参与者 Flyweight:抽象享元类 ConcreteFlywei

12、ght:具体享元类 UnsharedConcreteFlyweight:非共享具体享元类 FlyweightFactory:享元工厂类 Client:客户类,享元模式(Flyweight),例子 定义一个场景:有一个汽车类型,客户程序要实例化10000个,实例化后查看一下内存分配情况。,public class Car private string body; private string wheel; private string engine; private string brand; private string color; public Car(string body, strin

13、g wheel, string engine, string brand, string color) Body = body; Wheel = wheel; Engine = engine; Brand = brand; Color = color; ,享元模式(Flyweight),普通面向对象模式,static void Main(string args) Console.WriteLine(实例化前: + GC.GetTotalMemory(false); ArrayList list = new ArrayList(10000); for (int i = 0; i 10000; i

14、+) Car car = new Car(4.2M, Wheel, NeedForSpeed, BMW, Black); list.Add(car); Console.WriteLine(实例化后: + GC.GetTotalMemory(false); Console.Read(); ,享元模式(Flyweight),享元模式,public class FlyWeightCar private string brand; public string Brand get return brand; set brand = value; private CarBody carbody; publ

15、ic CarBody CarBody get return carbody; set this.carbody = value; ,public class CarBody private string body; private string wheel; private string engine; private string color; public CarBody(string body, string wheel, string engine, string color) Body = body; Wheel = wheel; Engine = engine; Color = c

16、olor; public string Body get return body; set body = value; public string Wheel get return wheel; set wheel = value; ,享元模式(Flyweight),享元模式,public class FlyWeightFactory private static FlyWeightCar car; private static Hashtable table = new Hashtable(); public static FlyWeightCar CreateInit(string bod

17、y, string wheel, string engine, string brand, string color) if (tablebrand != null) car = (FlyWeightCar)tablebrand; else car = new FlyWeightCar(); car.Brand = brand; car.CarBody = new CarBody(body, wheel, engine, color); table.Add(brand, car); return car; ,享元模式(Flyweight),享元模式,static void Main(strin

18、g args) Console.WriteLine(实例化前: + GC.GetTotalMemory(false); ArrayList list = new ArrayList(10000); for (int i = 0; i 10000; i+) FlyWeightCar car = FlyWeightFactory.CreateInit(4.2M, Wheel, NeedForSpeed, BMW, Black); list.Add(car); Console.WriteLine(实例化后: + GC.GetTotalMemory(false); Console.Read(); ,享元模式(Flyweight),享元模式的优缺点如下 享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:享元模式使得系统更加复杂。 为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。,享元模式(Flyweight),模式使用 当以下所有的条件

温馨提示

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

最新文档

评论

0/150

提交评论