Design Patterns in ActionScript-Flyweight

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

var str1:String = new String(”foo”);
var str2:String = “foo”;
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.

public static function getTank(key:String):Tank
{
if(tankList[key] == null)
{
if(key == “Guardian”)
tankList[key] = new GuardianTank();
else if(key == “Apocalypse”)
tankList[key] = new ApocalypseTank();
}

return Tank(tankList[key]);
}

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. Download Download Full Project

Enjoy!

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • DZone
  • Reddit
  • Technorati
  • StumbleUpon
  • Twitter
RSS Enjoy this Post? Subscribe to Ntt.cc

RSS Feed   RSS Feed     Email Feed  Email Feed Follow us Follow us
You can leave a response, or trackback from your own site.

One Response to “Design Patterns in ActionScript-Flyweight”

Leave a Reply