一、先说一下AS3中的反射
public function getDefinitionByName(name:String):Object
返回 name 参数指定的类的类对象引用。
以下示例使用 GetDefinitionByNameExample 类在舞台上创建一个橙色的正方形。这是使用以下步骤完成的:
声明代表橙色背景颜色和 80 像素大小的变量,这些变量稍后将用于绘制正方形。
在构造函数内,将 Class 类型的变量 ClassReference 赋予 Sprite。
对名为 instance 的 ClassReference 的实例进行实例化。
由于 instance 按引用是 Sprite 对象,因此可以使用可用于 Sprite 的方法绘制正方形并将其添加到显示列表。
package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.utils.getDefinitionByName;
public class GetDefinitionByNameExample extends Sprite {
private var bgColor:uint = 0xFFCC00;
private var size:uint = 80;
public function GetDefinitionByNameExample() {
var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class;
var instance:Object = new ClassReference();
instance.graphics.beginFill(bgColor);
instance.graphics.drawRect(0, 0, size, size);
instance.graphics.endFill();
addChild(DisplayObject(instance));
}
}
}
注意,当我们使用自定义的类TestClass时,可能会报ReferenceError:Error #1065:变量TestClass未定义。
这是因为运行中反射,在SWF中取不到TestClass类编译的文件。即使import了也不行,因为import的类只要没有用到,还是会被编译器当作垃圾自动忽略掉。
解决办法也很简单,在工程别的地方用一下TestClass,或者在本类中声明一个未实例化的变量比如var tc:TestClass,或者直接TestClass不声明变量亦可。
二、看一下mx.core.Singleton的源码:
private static var classMap:Object = {};
public static function registerClass(interfaceName:String,clazz:Class):void{
var c:Class = classMap[interfaceName];
if(!c)
classMap[interfaceName] = clazz;
}
public static function getClass(interfaceName:String):Class{
return classMap[interfaceName];
}
public static function getInstance(interfaceName:String):Class{
var c:Class = classMap[interfaceName];
if(!c)
{
throw new Error("No class registered for interface '" + interfaceName + "'.");
}
return c["getInstance"]();
}
代码很简洁,比如在类FlexModuleFactory中注册:
Singleton.registerClass("mx.managers::IHistoryManager",
Class(getDefinitionByName("mx.managers::HistoryManagerImpl")));
比如在DataGridColumn中取出:
_embeddedFontRegistry = IembeddedFontRegistry(
Singleton.getInstance("mx.core::IembeddedFontRegistry"));
需要注意的是这句:return c["getInstance"]();
它等于上面例子中的写法:
var ClassReference:Class = getDefinitionByName("interfaceName") as Class;
var instance:Object = new ClassReference();
return instance.getInstance();
三、参考链接:How to use mx.core.Singleton(http://www.duzengqiang.com/blog/post/607.html)
分享到:
相关推荐
perl-Class-Singleton-1.4-6.el6.noarch.rpm perl-Class-Singleton-1.4-6.el6.noarch.rpm
资源来自pypi官网。 资源全名:dask-actor-singleton-1.1.0.tar.gz
python库。 资源全名:django-singleton-admin-0.0.2.macosx-10.7-intel.exe
离线安装包,亲测可用
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用
1.单例模式(Singleton Pattern) 2.工厂模式 3.抽象工厂模式(Abstract Factory 4.模板方法模式(Template Met
一个java线程安全的单例模式:饥饿模式和延迟加载
java Singleton单例模式 java Singleton单例模式
此示例展示了Qml 的单例模式(类似全局对象,只生成一次实例,可全局使用) surfsky.cnblogs.com
used throughout the text: singleton, container, enumeration, adapter and visitor. Virtually all of the data structures are presented in the context of a single, unified, polymorphic class hierarchy. ...
在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。
实现了单例模型。 vs2015的工程
单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge...
SingleTon.rarSingleTon.rarSingleTon.rarSingleTon.rar单例设计模式
Laravel开发-singleton-pattern 帮助程序包来实现单例类。
delphi 单例模式 设计模式中的单例模式 与其他语言相似