设计模式学习笔记十二(Flyweight享元模式)

动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价――主要指内存需求方面的代价。如何避免在大量细粒度的对象问题的同时,让外部客户仍然能够按照面向对象的方式来进行操作就是Flyweight模式要解决的问题。

意图:运用共享技术有效地支持大量细粒度对象。

基本Code

public class Font    //12 bytes+8 bytes=20 bytes,8 byte是类指针(包括虚表指针和同步指针)

{

     string  fontName;      //4 bytes,因为是地址引用,所以地址指针占4byte

     int  Size;             //4 bytes

     Color  color;          //4 bytes

}

public  class  Character  //(2+4+20+2)+8=36 byte ,2 bytechar 的引用

{

    char c;  // 16Bit, 2 Bytes

     Font f;  //20 bytes,因为是类,所以还应该有4 byte 的地址指针

}

 

public class System

{

     public static void Main()

     {

         //36byte * 100000=3600 K-3M

         ArrayList  list=new ArrayList(100000);

         for (int i=0;i<list.Length;i++)

         {

              Charactor c=  new Character();

              list.Add( c );

         }

     }

}

使用Flyweight模式的Code如下:

public class Font    //12 bytes+8 bytes=20 bytes,8 byte是类指针(包括虚表指针和同步指针)

{

     public string  fontName;    //4 bytes,因为是地址引用,所以地址指针占4byte

     public int  Size;                //4 bytes

     public Color  color;             //4 bytes

     public Font(string name,int size,Color color)

     {

         this.fontName=name;

         this.size=size;

         this.color=color;

    }

     //重写Font.Equals方法

     public override bool Equals(Font f)

     {

         if (f.fontName==fontName && color==f.color && f.Size==Size)

         {

              return true;

         }

         else

         {

              return false;

         }

     }

}

 

public  static  class  FlyWeightFactory

{

     static Hashtable  fontTable;

     public static Font GetFont(Font f)

     {

         if (fontTable==null)

         {

              fontTable=new HashTable();

         }

         if (fontTable.Keys.Exists( f))

         {

              return  fontTable.Keys[f];

         }

         else

         {

              fontTable.Keys.Add(f);

              return  fontTable.Keys[f];

         }

     }

}

 

public  class  Character

{

    public char chr;  // 16Bit, 2 Bytes

    public Font font;

}

 

public class System

{

     public static void Main()

     {

         ArrayList  list=new ArrayList(100000);

          Font f1= new Font("宋体",5,Color.Red);

         for (int i=0;i<list.Length;i++)

         {

             Character c= new Character();

              c.chr="a";

              c.font = FlyWeightFactory.GetFont(f1);

              list.Add( c );

         }

     }

}

在使用Flyweight模式之前一定要计算对象内存开销大小。

Flyweight模式结构图如下所示:

Flyweight模式要点:

1、  面向对象很好地解决了抽象性问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight模式主要解决面向对象的代价问题,一般不触及面向对象的抽象问题。

2、  Flyweight模式采用共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。

3、  对象的数量太大从而导致对象内存开销加大――什么样的数量才算大?这需要我们仔细地根据具体应用情况进行评估,而不能凭空臆断。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值