Design Patterns in ActionScript-Flyweight

In Action Script 3.0 we have the following ways to define a String.

  1. var str1 : String = new String ( foo ) ;
  2. var   str2 : String = “ foo ”;
  3. var   str3 : String = String ( foo ) ;

I don’t know which way is your way, but they work the same way. Actually, all of the three String variables point to the same String object in memory. That’s to say there is only one copy of “foo” object in the memory, but three references. In other languages, such as java, are almost the same. It saves the memory. This is called object pool. And there is a similar pattern called Flyweight.

Let’s take a look at its intent.

 

 

Use sharing to support large numbers of fine-grained objects efficiently.

– By THE GOF BOOK

Do you remember the Red Alert, when I played this game with my friends; we often made many tanks, and just one or two types.

If you’re the designer of the Red Alert, what will you do? Write a tank class, and let the concrete tank inherit it. Then when the player made one, get a corresponding object in the memory. This is a solution, but maybe not a good one, because it will take many memories and the memory is a scarce resource, so, we need to fix it.

The concrete tank shares the same model. The difference is just the coordinate and the direction. If we abstract these attributes, then a kind of concrete tank can share the same object, which just including the model.

So, we create a ExtrinsicState class for the extrinsic attributes, and create a Tank interface, and let the concrete tank implements it. The concrete tank class will only have the intrinsic attributes. Note that some operations will need the extrinsic state.

So, the class diagram will be as follows.

clip_image001

And in the tank factory, we produce the concrete tank, but not always create the concrete tank; you can see the following code.

  1. public static function getTank ( key : String ) : Tank
  2. {
  3. if ( tankList [ key ] == null )
  4. {
  5. if ( key == “ Guardian )
  6. tankList [ key ] = new   GuardianTank () ;
  7. else   if ( key == “ Apocalypse )
  8. tankList [ key ] = new   ApocalypseTank () ;
  9. }
  10.  
  11. return   Tank ( tankList [ key ]) ;
  12. }

We use a tankList to hold the objects we have created, so, when the user wants a tank that we’ve already created, just return it, not need to create again.

Of course, when we do some operations, we may need the extrinsic state, so, pass the extrinsic state as a parameter, and then we get different appearance of each tank. DownloadDownload Full Project

Enjoy!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值