在Flex/ActionScript3中实现单例
Flex的ActionScript3语言中,类的构造函数只能是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++,Java,C#。你不喜欢这样没有类型的单例对象,那么没关系,我们也可以很简单地给它提供类型。
如,我们可以定义一个接口,让我们的内部类实现这个接口。这样,单例对象就有类型了。也可以实现抽象类,让我们的内部类继承这个抽象类。我们的单例对象就有了类型了。
慢着,ActionScript3有抽象类吗?
没错,没有。但是我们可以模拟它。这将在我的下一篇文章中介绍。