Design Patterns in ActionScript-Singleton

In our real world, many things are one and only. For example, there is only one god in our world, and only one president in the USA, eh, I mean the current president. One and only is very important to our world, and so does to our program.

 
     In some case, we may only need one instance of some classes. If you have any experience on developing the GUI application, you can feel it. For example, there’s only one display object in J2ME application, and only one form in windows application. During those situations, we need to control the number of the class, and it was forbidden that using the new operator to generate a new instance. Further more, we need to supply an interface for accessing the one and only instance.

 

That’s all about the singleton pattern. And the intent defined by GOF is as follows.

Ensure a class only has one instance, and provide a global point of access to it.

–By GOF BOOK

Now, we come to the operation layer.

In general, we will meet two problems here, one is when to initialize the instance and the other is how to ensure thread-safe in the multithread environment. Because Action Script 3 doesn’t support multithread, so we don’t need to care the thread-safe.

Before we solve the first problem, we need to provide a global access point for getting the instance. Of course, we don’t except the users use the new operator to get a new instance. Maybe we could change the constructor modifier from public to private. Eh, if you really do so, you’ll get a complier error, because in Action Script 3, the modifier of a constructor can only be public. So, we need to change our method.

If we can’t change the modifier, the constructor can be called outside. One solution is we can throw an error in the constructor, just like below.

  1. public function President ()
  2. {
  3. if ( president != null )
  4. throw   new Error ( You shouldn t use the new operator !” ) ;
  5. }

If there is already have an instance, we need to throw an error. If not, let it go, and then we can get an instance.

This is not a good way, but it works :). Now, let’s come to the first problem. In general, there will be two kinds solution. One is called early initialization, the other is lazy initialization. The first one initializes the instance when the program first runs, and the other initializes the instance when the getInstance () method called.

The code below shows early initialization. The instance will get initialized when the class gets initialized.

  1. static var president : President = new President () ;
  2. public   static function getInstance () : President
  3. {
  4. return   president ;
  5. }

The code below shows lazy initialization. As you see, after the getInstance() method was called, the instance will get initialized.

  1. static var president : President = null ;
  2.  
  3. public   static function getInstance () : President
  4. {
  5. if ( president == null )
  6. president = new   President () ;
  7. return   president ;
  8. }

Which way should be taken depends on your demand. Actually, you’ll need to consider these two situations only when you using this pattern to get a big object in the memory limit environment.

You can download the full source code from downloadhere .

Enjoy!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值