`

Flyweight (享元)

阅读更多

   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;
        }
    }
}
 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 69.2 KB
分享到:
评论

相关推荐

    FlyWeight享元

    总结来说,FlyWeight享元模式是一种优化内存使用的设计策略,通过共享对象减少系统中对象的数量,从而提高系统效率。理解并合理运用享元模式,对于编写高效且资源友好的代码至关重要。在开发过程中,我们需要识别...

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)

    享元模式是面向对象设计中的一种结构型模式,它的主要目的是通过共享大量相似对象来减少内存的使用,提高系统的性能。在C#编程语言中,我们可以利用享元模式来优化那些具有大量实例但大部分状态可以共享的对象。在这...

    C#面向对象设计模式纵横谈\12 结构型模式Flyweight享元模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第12节:结构型模式Flyweight享元模式

    设计模式学习笔记--Flyweight享元模式.docx

    享元模式的核心是Flyweight类,它是需要被共享的对象,通常包含两个部分:内在状态(Intrinsic State)和外在状态(Extrinsic State)。内在状态是指对象内部不变的部分,可以在多个对象之间共享;外在状态是随环境...

    C++设计模式编程之Flyweight享元模式结构详解

    1. Flyweight(享元):这是享元类的抽象基类,定义了一个接口,通过这个接口可以处理外部状态。例如,一个字符类可能有一个接口来接收颜色和位置等信息。 2. ConcreteFlyweight(具体享元):实现了Flyweight接口...

    享元模式flyweight

    享元模式(Flyweight Pattern)是一种结构型设计模式,它能有效地减少系统中对象的数量,从而降低内存消耗,提高性能。这种模式通过共享大量相似对象的内部状态来达到这一目标,而只保留对象的外部状态在外部管理。...

    详解Java设计模式编程中的Flyweight享元模式的开发结构

    1. 抽象享元(Flyweight)角色: 抽象享元是享元模式的核心,定义了一个公共接口,为客户端提供了操作共享对象的途径。在Java中,这个角色通常表现为一个接口,例如`Letter`,包含所有可能的操作。 2. 具体享元...

    c++-设计模式之享元模式(Flyweight)

    享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建大量小对象所带来的内存开销。通过共享对象,享元模式能够有效地支持大量细粒度的对象,减少内存使用并提高性能。它常用于需要大量重复对象的场景...

    设计模式(C#)之享元模式(Flyweight Pattern)

    2. **享元工厂(Flyweight Factory)**:负责创建和管理享元对象,确保享元对象的正确共享,并提供一个接口供客户端获取享元对象。享元工厂还需要处理外部状态,可能需要通过组合或聚合外部状态来构造完整的对象。 3...

    C++设计模式课件13_Flyweight_享元模式.pdf

    1. **抽象享元角色(Flyweight)**:定义一个接口,用于具体享元类继承或实现。它负责定义出所有具体享元类所共有的公共接口。 2. **具体享元角色(Concrete Flyweight)**:实现抽象享元角色中定义的接口,并为内部...

    学习php设计模式 php实现享元模式(flyweight)

    享元模式(Flyweight Pattern)是软件设计中的一种结构型设计模式,它通过共享技术来支持大量细粒度的对象,以此来降低内存中对象的数量。在PHP中实现享元模式,可以帮助我们优化程序性能,特别是在对象数目过多时,...

    23种Python设计模式示例演示源码包.rar

    比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享元模式,Interpreter解释器模式,...

    C#设计模式之Flyweight

    3. **享元工厂(Flyweight Factory)**:负责创建和管理享元对象,它确保享元对象的正确共享,并根据需要提供适当的享元实例给客户端。享元工厂可以是一个静态类,也可以是具有实例的类。 4. **外部状态(External ...

    设计模式的享元模式的例子

    3. **享元工厂(Flyweight Factory)**:负责创建和管理享元对象,确保享元对象的正确共享,并为客户端提供获取享元对象的接口。它通常会根据外部状态来决定是否创建新对象,或者返回已存在的享元对象。 4. **...

    23个软件设计类图详解.rar

    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(客户端)**:使用享元对象,负责...

Global site tag (gtag.js) - Google Analytics