arm-linux

http://armboard.taobao.com/

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  Flex/ActionScript3中实现单例

 

 

FlexActionScript3语言中,类的构造函数只能是public类型的。

而在Java等语言中,我们通常使用这样的方法实现单例:

1,把构造函数声明为private的方法,阻止用户创建对象,从而阻止用户使用new 创建对象。

2,声明静态变量,用它来持有一个类的实例。实现单例。

 

这里,我介绍一种在ActionScript3语言中实现单例的方法。

这种方法的原理是,ActionScript3语言中有一个办法,可以把类的访问范围限制在一个源文件内,而不让外部文件的代码看到。这样,外部代码自然无法使用new创建该类的对象。甚至该类在外部也无法看到。

但是,该类的实例在源文件外部还是可用的。

由于ActionScript3实际上是一种动态类型语言。因此,现在外部代码持有这个对象,尽管不能访问该对象的类型,但依然可以调用该对象的属性、方法。照常使用。

现在请看一下例子:

package org.shendl.lab.flex

{

    import flash.errors.IllegalOperationError;

   

    public class SingletonFactory

    {

       private static var instance:MySingleton=null;

      

       public function Singleton()

       {

           //TODO: implement function

           throw new IllegalOperationError("Can't new SingletonFactory(),Please call getInstance()!");

       }

      

       public static function getInstance():MySingleton{

          if(SingletonFactory.instance==null){

              SingletonFactory.instance=new MySingleton();

          }

          return SingletonFactory.instance;

      

       }

 

    }

}

/*

   package声明之外的源代码只在本源文件中可见!

*/

class  MySingleton {

        public function say(){

            return "MySingleton say";

        }

  

   }

 

使用时:

SingletonFactory.getInstance().say();

 

 

 

也许你是一个静态语言背景的程序员,如C++JavaC#。你不喜欢这样没有类型的单例对象,那么没关系,我们也可以很简单地给它提供类型。

如,我们可以定义一个接口,让我们的内部类实现这个接口。这样,单例对象就有类型了。也可以实现抽象类,让我们的内部类继承这个抽象类。我们的单例对象就有了类型了。

慢着,ActionScript3有抽象类吗?

没错,没有。但是我们可以模拟它。这将在我的下一篇文章中介绍。

 

 

 

 

 

 

 

posted on 2008-12-03 11:33  arm-linux  阅读(278)  评论(0编辑  收藏  举报