- 浏览: 390489 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yanmie:
您的文章已被我们收录地址:http://www.airmyth ...
学习一下 Pixel Bender -
chaimzane:
我现在自己都有点看不懂了 实际上很简单, LocaleModu ...
Flex 优化技巧 -- 全局CSS样式模块实现RSLS 方式加载 -
muqingren:
以我现在对flex的了解,没看懂你说的........... ...
Flex 优化技巧 -- 全局CSS样式模块实现RSLS 方式加载 -
cony138:
卤煮碉堡了啊
A*寻路 -- 更加真实 的路径(一) -
jack_ye:
[/flash][/flash][/fl[u][u]ash][ ...
Alternativa3D 8 基础理论 / 概念
Flyweight (享元)模式,是结构型模式,它是运用共享技术有效的支持大量细粒度的对象。
避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类),Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。
适用性:
1、一个应用用了大量的对象,造成很大的存储开销。
2、对象的大多数状态可以改变为外部状态
3、如果删除对象的外部状态,那么可以用相对较少的共享对象爱那个取代很多组对象
4、应用程序不依赖于对象标识。
例子:网上有很多的关于FlyWeight的例子,我这里举个例子,是在flash中能说明问题的。
有这么一个需求,在一个flash界面需要大量的显示 人物的虚拟信息,可能显示到上千个。这个人物信息你很简单,头像(男人、女人来表示性别)、名字、年龄、省份。假设,Flash cs 已经导入两张图片 分别对应的类为 MalePic FemalePic。
你可能这样定义人物类
Character.as package { import flash.display.*; import flash.text.*; public class Character extends Sprite { private var nameStr:String; private var isMale:Boolean; private var age:uint; private var province:String; private var portrait:Bitmap; private var nameLabel:TextField; private var ageLabel:TextField; private var provinceLabel:TextField public function Character(name:String,isMale:Boolean,age:uint,province:String) { cratePortrait(); cratenaMeLabel(); crateAgeLabel(); crateProvinceLabel(); setName(name); setSex(isMale); setAge(age); setProvince(province); } private function cratePortrait():void { portrait = new Bitmap(); addChild(portrait); } private function cratenaMeLabel():void { nameLabel = new TextField(); nameLabel.autoSize = TextFieldAutoSize.LEFT; addChild(nameLabel); nameLabel.x = 139; } private function crateAgeLabel():void { ageLabel = new TextField(); ageLabel.autoSize = TextFieldAutoSize.LEFT; addChild(ageLabel); ageLabel.x = 139; ageLabel.y = 20; } private function crateProvinceLabel():void { provinceLabel = new TextField(); provinceLabel.autoSize = TextFieldAutoSize.LEFT; addChild(provinceLabel); provinceLabel.x = 139; provinceLabel.y = 40; } public function setName(name:String):void { this.nameStr = name; nameLabel.text = "姓名:"+name; } public function getName():String { return nameStr; } public function setSex(isMale:Boolean):void { isMale = isMale; if(isMale) { portrait.bitmapData = new MalePic(0,0); } else { portrait.bitmapData = new FemalePic(0,0); } } public function getSex():String { return isMale?"男":"女"; } public function setAge(value:uint):void { age = value; ageLabel.text = "年龄:"+value.toString(); } public function getAge():uint { return age; } public function setProvince(value:String):void { province = value; provinceLabel.text = "省份: "+value; } public function getProvince():String { return province; } } }
然后在时间轴上面简单的写一个循环的代码,
for(var i=0;i<500;i++) { var a:Character = new Character("张一"+i,true,i,"江苏"); addChild(a); a.x = a.y = Math.random()*stage.stageWidth; }
就会发现创建过程很卡。才500个就卡成这样?,想一想,头像几乎是每一次创建一个都要new 一个BitmapData(),反正就那么2个,能不能共用呢呢,不要每次都重新new 一下,在大量的对象面前,这是很浪费的。
还好设计模式里面有一个叫做,FlyWeight的模式,享元。
下面就用FlyWeight模式看看会不会好点。
PortraitFlyweight .as package { import flash.display.*; public class PortraitFlyweight { private var isMale:Boolean; public function PortraitFlyweight(isMale:Boolean) { this.isMale = isMale; } public function getBitmapDataBySex():BitmapData { if(isMale) { return new MalePic(0,0); } else { return new FemalePic(0,0); } } } }
FlyWeightFactory .as package { public class FlyWeightFactory { private static var instance:FlyWeightFactory; public function FlyWeightFactory (){ } public static function getInstace():FlyWeightFactory { if(!instance) { instance = new FlyWeightFactory(); } return instance; } private var PortraitFlyweightArry:Array = []; public function getPortraitFlyweight(isMale:Boolean):PortraitFlyweight { var result:PortraitFlyweight = PortraitFlyweightArry[String(isMale)] as PortraitFlyweight; if(!result) { result = PortraitFlyweightArry[String(isMale)] = new PortraitFlyweight(isMale); } return result; } } }
发表评论
-
Visitor 访问者 行为模式
2009-02-25 00:55 1091Visitor 访问者 行为模式,表示一个作用于某个对象结构中 ... -
Template Method 模板方法 行为模式
2009-02-25 00:54 916Template Method 模板方法 行为模式,定义一个操 ... -
Strategy 策略 行为模式
2009-02-25 00:52 881Strategy 策略 行为模式,定义一系列的算法,把他们一个 ... -
State 状态 行为模式
2009-02-25 00:50 1112State 状态 行为模式,允许一个对象在其内部状态改变时改变 ... -
Observer 观察者 行为模式
2009-02-25 00:48 1636Observer 观察者 行为模式,定义对象的一对多的依赖关系 ... -
Memento 备忘录 行为模式
2009-02-25 00:46 1201Memento 备忘录 行为模式 ... -
Mediator 中介 行为模式
2009-02-25 00:44 1533Mediator 中介 行为 ... -
Iterator 迭代器 行为模式
2009-02-25 00:41 1892Iterator 迭代器 行为模式,提供一种顺序访问一个聚合对 ... -
Interpreter 解释器 行为模式
2009-02-25 00:40 894Interpreter 解释器 行为模式,给定一个语言,定义它 ... -
Command 命令 行为模式
2009-02-25 00:35 1365Command 命令 行为模式,将一个请求封装为一个对象 ... -
Chain of Responsibility 职责链 行为模式
2009-02-25 00:02 946Chain of Responsibility 职责链 行为模 ... -
Proxy 代理
2009-02-24 23:46 2023Proxy 代理,为其他对象提供一个代理以控制这个对象。 ... -
Facade 外观
2009-02-24 15:00 1646Facade 外观,结构型模式,为子系统中的一组接口提供一个一 ... -
Composite 组合
2009-02-23 23:45 873Composite 组合模式,将对象组合成树形结构以表示“部分 ... -
Decorator 装饰模式
2009-02-23 23:42 1281Decorator 装饰模式,对象 ... -
Bridge 桥接
2009-02-23 23:11 1131Bridge 桥接,对象结构型模式,将抽象部分与实 ... -
Adapter 适配器
2009-02-23 18:44 1100Adapter 适配器,类对象结构型模式,将一个类的接口转化为 ... -
Prototype 原型 Singleton单件
2009-02-23 14:43 1216Prototype 原型,创建型模式,用原型实例指定创建对象的 ... -
Factory Method 工厂方法
2009-02-23 14:09 1128Factory Method 工厂方法,创建型 模式,她定义一 ... -
Builder 模式
2009-02-23 13:54 1166Builder 模式,生成器,将一个复杂对象的构建鱼他的表示分 ...
相关推荐
总结来说,FlyWeight享元模式是一种优化内存使用的设计策略,通过共享对象减少系统中对象的数量,从而提高系统效率。理解并合理运用享元模式,对于编写高效且资源友好的代码至关重要。在开发过程中,我们需要识别...
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)
享元模式是面向对象设计中的一种结构型模式,它的主要目的是通过共享大量相似对象来减少内存的使用,提高系统的性能。在C#编程语言中,我们可以利用享元模式来优化那些具有大量实例但大部分状态可以共享的对象。在这...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第12节:结构型模式Flyweight享元模式
享元模式的核心是Flyweight类,它是需要被共享的对象,通常包含两个部分:内在状态(Intrinsic State)和外在状态(Extrinsic State)。内在状态是指对象内部不变的部分,可以在多个对象之间共享;外在状态是随环境...
1. Flyweight(享元):这是享元类的抽象基类,定义了一个接口,通过这个接口可以处理外部状态。例如,一个字符类可能有一个接口来接收颜色和位置等信息。 2. ConcreteFlyweight(具体享元):实现了Flyweight接口...
享元模式(Flyweight Pattern)是一种结构型设计模式,它能有效地减少系统中对象的数量,从而降低内存消耗,提高性能。这种模式通过共享大量相似对象的内部状态来达到这一目标,而只保留对象的外部状态在外部管理。...
1. 抽象享元(Flyweight)角色: 抽象享元是享元模式的核心,定义了一个公共接口,为客户端提供了操作共享对象的途径。在Java中,这个角色通常表现为一个接口,例如`Letter`,包含所有可能的操作。 2. 具体享元...
享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建大量小对象所带来的内存开销。通过共享对象,享元模式能够有效地支持大量细粒度的对象,减少内存使用并提高性能。它常用于需要大量重复对象的场景...
2. **享元工厂(Flyweight Factory)**:负责创建和管理享元对象,确保享元对象的正确共享,并提供一个接口供客户端获取享元对象。享元工厂还需要处理外部状态,可能需要通过组合或聚合外部状态来构造完整的对象。 3...
1. **抽象享元角色(Flyweight)**:定义一个接口,用于具体享元类继承或实现。它负责定义出所有具体享元类所共有的公共接口。 2. **具体享元角色(Concrete Flyweight)**:实现抽象享元角色中定义的接口,并为内部...
享元模式(Flyweight Pattern)是软件设计中的一种结构型设计模式,它通过共享技术来支持大量细粒度的对象,以此来降低内存中对象的数量。在PHP中实现享元模式,可以帮助我们优化程序性能,特别是在对象数目过多时,...
比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享元模式,Interpreter解释器模式,...
3. **享元工厂(Flyweight Factory)**:负责创建和管理享元对象,它确保享元对象的正确共享,并根据需要提供适当的享元实例给客户端。享元工厂可以是一个静态类,也可以是具有实例的类。 4. **外部状态(External ...
3. **享元工厂(Flyweight Factory)**:负责创建和管理享元对象,确保享元对象的正确共享,并为客户端提供获取享元对象的接口。它通常会根据外部状态来决定是否创建新对象,或者返回已存在的享元对象。 4. **...
6、Flyweight 享元模式 7、Proxy 代理模式 11个行为模式: 1、Chain of Responsibility 职责链 2、Command 命令 3、Interpreter 解释器 4、Iterator 迭代器 5、Mediator 中介者 6、Memento 备忘录 7、...
3. **Flyweight Factory(享元工厂)**:负责创建和管理享元对象,确保享元对象的正确共享。它还接收外部状态,并将其与内部状态分离,将外部状态封装到客户端对象中。 4. **Client(客户端)**:使用享元对象,负责...