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.

Design Patterns in ActionScript-Flyweight

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. Design Patterns in ActionScript-FlyweightDownload Full Project

Enjoy!