1 概述
所有的静态类由registry注册管理。比如应用程序的pop-up管理器由PopUpManagerImpl提供一个单例的实例。当应用程序加载modules或子应用程序时,其PopUpManagerImpl 将被加入进行管理。
应用程序或module的factory类(比如SystemManager 或 FlexModuleFactory),两个工厂类都实现了IFlexModuleFactory中的registerClass()方法,并在registry注册。之后,其它的类调用 getInstance() 来获取singleton实例。
registry政策是
先来为王,比如主应用程序的注册了 PopUpManagerImpl,则一个加载的SWF可以使用PopUpManagerImpl。如果主应用程序不包含 PopUpManagerImpl,也不会注册 PopUpManagerImpl,加载的SWF如果包含 PopUpManagerImpl,则进行注册。
3 源代码
-
package mx.core
-
{
-
[ExcludeClass] //是Flex Builder 标签检查器忽略类。这相当于ASDoc中的 @private 标签。
-
public class Singleton
-
{
-
include "../core/Version.as"; //只有一句mx_internal static const VERSION:String = "4.5.1.0";
-
-
// 类变量
-
-
/**
-
* 一个描述完整的的接口名称map,比如mx.managers::IPopUpManager。
-
* 主要是为了类执行时采用单例模式,比如mx.managers.PopUpManagerImpl
-
*/
-
private static var classMap:Object = {};
-
-
// 类方法
-
/**
-
* 如果一个类没有注册描述的接口。则在registry上添加一个“接口名--执行类”的映射。
-
* 类必须执行方法getInstance() ,返回其单例实例。
-
*/
-
public static function registerClass(interfaceName:String,
-
clazz:Class):void
-
{
-
var c:Class = classMap[interfaceName];
-
if (!c)
-
classMap[interfaceName] = clazz;
-
}
-
-
/**
-
* 返回注册接口的实现类。
-
* 如果接口没有实现类进行注册,返回null。
-
*
-
* 这个方法不能在静态初始化期间被调用,因为工厂类可能还没有调用registerClass()。
-
*/
-
public static function getClass(interfaceName:String):Class
-
{
-
return classMap[interfaceName];
-
}
-
-
/**
-
* 在registry中查找类,如果描述的接口有相应的实现类注册,返回该类的单例实例
-
* 这个方法不能在静态初始化期间被调用,因为工厂类可能还没有调用registerClass()。
-
*/
-
public static function getInstance(interfaceName:String):Object
-
{
-
var c:Class = classMap[interfaceName];
-
if (!c)
-
{
-
throw new Error("No class registered for interface '" +
-
interfaceName + "'.");
-
}
-
return c["getInstance"]();
-
}
-
}
-
-
}
说明
1.include语句详见《
actionscript语言中的include、mx_internal、namespace》
2.c["getInstance"]();
它等于上面例子中的写法:
var ClassReference:Class = getDefinitionByName("interfaceName") as Class;
var instance:Object = new ClassReference();
return instance.getInstance();
详见《
Actionscipt_将字符串转换成类,函数,变量》中的字符串转换成函数。
参考文献
1.
2.
阅读(2681) | 评论(0) | 转发(0) |