Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3352142
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类: Web开发

2011-11-05 16:46:24

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 源代码
  1. package mx.core
  2. {
  3. [ExcludeClass] //是Flex Builder 标签检查器忽略类。这相当于ASDoc中的 @private 标签。
  4. public class Singleton
  5. {
  6.     include "../core/Version.as";  //只有一句mx_internal static const VERSION:String = "4.5.1.0";
  7.     
  8.     // 类变量

  9.     /**
  10.      * 一个描述完整的的接口名称map,比如mx.managers::IPopUpManager。
  11.      * 主要是为了类执行时采用单例模式,比如mx.managers.PopUpManagerImpl
  12.      */
  13.     private static var classMap:Object = {};

  14.     // 类方法
  15.     /**
  16.      * 如果一个类没有注册描述的接口。则在registry上添加一个“接口名--执行类”的映射。
  17.      * 类必须执行方法getInstance() ,返回其单例实例。
  18.      */
  19.     public static function registerClass(interfaceName:String,
  20.                                          clazz:Class):void
  21.     {
  22.         var c:Class = classMap[interfaceName];
  23.         if (!c)
  24.             classMap[interfaceName] = clazz;
  25.     }

  26.     /**
  27.      * 返回注册接口的实现类。
  28.      * 如果接口没有实现类进行注册,返回null。
  29.      *
  30.      * 这个方法不能在静态初始化期间被调用,因为工厂类可能还没有调用registerClass()。
  31.      */
  32.     public static function getClass(interfaceName:String):Class
  33.     {
  34.         return classMap[interfaceName];
  35.     }

  36.     /**
  37.      * 在registry中查找类,如果描述的接口有相应的实现类注册,返回该类的单例实例
  38.      * 这个方法不能在静态初始化期间被调用,因为工厂类可能还没有调用registerClass()。
  39.      */
  40.     public static function getInstance(interfaceName:String):Object
  41.     {
  42.         var c:Class = classMap[interfaceName];
  43.         if (!c)
  44.         {
  45.             throw new Error("No class registered for interface '" +
  46.                             interfaceName + "'.");
  47.         }
  48.         return c["getInstance"]();
  49.     }
  50. }

  51. }
说明
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.
阅读(2707) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~