package myFactory
{
import flash.utils.Dictionary;
//↓從測試檔貼過來改寫貼錯
public class MyFactory
{
private var _map:Dictionary = new Dictionary( );
public function MyFactory( )
{
}
//產生一個實體
public function getInstance( key:Object):Objcet
{
if(!_map[key]) return;
return new _map[key];
}
//註冊類別
public function register( key:Object , type:Object):Object
{
if(!type) return null;
//這裡可以寫一些不想被註冊的類型
//type如果是Class就直接記錄到_map ,不是就將物件反射成類別
if(type is Class)
{
return _map[key] = type;
}else
{
if(type is Object)
{
//以下做反射
//取回物件的Class名稱
var s:String = flash.utils.getQualifiedClassName(type);
//取回類別參照
var classReference:Class = Class(flash.utils.getDefinitionByName(s));
return _map[key] = classReference;
}else
{
return null;
}
}
}
//移除註冊對象
public function dell(key:Object ):Object
{
if( _map[key] )
{
//清除掉索引,待記憶體回收
_map[key] = null;
delete _map[key];
return 0;
}else{
return -1;
}
}
}
}
//來寫一個Mxml測試一下
<?xml version="1.0" encoding="utf-8"?>
<mx:Application applicationComplete="application1_applicationCompleteHandler(event)" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="1024" minHeight="768">
<mx:Script>
<![CDATA[
import myFactory.MyFactory;
import mx.controls.Button;
import mx.events.FlexEvent;
protected function application1_applicationCompleteHandler(event:FlexEvent):void
{
var fc:MyFactory= new MyFactory( );
var btn:Button = new Button( );
btn.label = "這是一個實體";
var btnClass:Class = Button;
//註冊,接受實體或類別,註冊用的Key可以寫一個conts以方便使用或防止出輸入錯誤。
//實體註冊,內部會做 Class反射,傳回一個新的Button
fc.register("btnInstance" ,btn);
//類別註冊
fc.register("btnClass" ,btnClass);
this.hbox.addChild(fc.getInstance( "btnInstance" ) as DisplayObject);
this.hbox.addChild(fc.getInstance( "btnClass" ) as DisplayObject);
//驗證
this.hbox.addChild(btn);
}
]]>
</mx:Script>
<mx:HBox id="hbox" />
</mx:Application>
反射也可以用於loader進來的swf檔當需與flash做結合非常方便。
//為什麼要使用工廠,因為可以避免直接去修改使用到工廠之類別的程式碼,以簡化程式,使用抽象類別或介面以超型態配合工廠。
沒有留言:
張貼留言