AS3 Design Pattern: Simple Factory 模式
2009年07月22日
Simple Factory模式(又称Static Factory模式),一个Simple Factory生产成品,而对客户端隐藏产品产生的细节。实作时定义一个产品介面(interface),并透过特定静态方法来建立成品。
假设有一个音乐盒工厂,购买音乐盒的客人不用知道音乐盒是如何制作的,他只要知道如何播放音乐盒就可以了,以 UML 类别图来表示以上的概念:
如上图所示的,MusicBoxDemo代表了客户的角色,它只依赖于IMusicBox介面,而不关心特定的实作,实际如何产生IMusicBox的实例由MusicBoxFactory完成,以一个简单的程式来实现上面这个UML类别图
[b]IMusicBox.as:[/b]
package com.showping.dp
{
public interface IMusicBox
{
function play():void;
}
}[b]PianoBox .as[/b]
public class PianoBox implements IMusicBox
{ public function play():void
{
trace("Piano is playing...");
}
}[b]ViolinBox .as[/b]
public class ViolinBox implements IMusicBox
{ public function play():void
{
trace("Violoin is playing...");
} }
[b]createMusicBox.as[/b]
import flash.system.ApplicationDomain;
public class MusicBoxFactory
{ public static function createMusicBox(name:String):IMusicBox
{
var _str:String="com.showping.dp" + "." + name;
var _box:Class=ApplicationDomain.currentDomain.getDefinition(_str) as Class;
return new _box as IMusicBox;
}
} [b]Simple_Factory.as:[/b]
package
{
import com.showping.dp.IMusicBox;
import com.showping.dp.MusicBoxFactory;
import com.showping.dp.PianoBox;
import com.showping.dp.ViolinBox;
import flash.display.Sprite; public class Simple_Factory extends Sprite
{
private var _piano:PianoBox;
private var _violin:ViolinBox;
public function Simple_Factory()
{
playMusicBox(MusicBoxFactory.createMusicBox("PianoBox"));
playMusicBox(MusicBoxFactory.createMusicBox("ViolinBox"));
} private function playMusicBox(musicBox:IMusicBox):void
{
musicBox.play();
}
}
}AS3有个特点,就是不被引用的类是不会被编译的,这一点跟Java区别很大
所以在Simple_Factory类里加入了两个引用,看似多余,其实必要,不然程序会报错。
2009年07月22日
Simple Factory模式(又称Static Factory模式),一个Simple Factory生产成品,而对客户端隐藏产品产生的细节。实作时定义一个产品介面(interface),并透过特定静态方法来建立成品。
假设有一个音乐盒工厂,购买音乐盒的客人不用知道音乐盒是如何制作的,他只要知道如何播放音乐盒就可以了,以 UML 类别图来表示以上的概念:
如上图所示的,MusicBoxDemo代表了客户的角色,它只依赖于IMusicBox介面,而不关心特定的实作,实际如何产生IMusicBox的实例由MusicBoxFactory完成,以一个简单的程式来实现上面这个UML类别图
[b]IMusicBox.as:[/b]
package com.showping.dp
{
public interface IMusicBox
{
function play():void;
}
}[b]PianoBox .as[/b]
public class PianoBox implements IMusicBox
{ public function play():void
{
trace("Piano is playing...");
}
}[b]ViolinBox .as[/b]
public class ViolinBox implements IMusicBox
{ public function play():void
{
trace("Violoin is playing...");
} }
[b]createMusicBox.as[/b]
import flash.system.ApplicationDomain;
public class MusicBoxFactory
{ public static function createMusicBox(name:String):IMusicBox
{
var _str:String="com.showping.dp" + "." + name;
var _box:Class=ApplicationDomain.currentDomain.getDefinition(_str) as Class;
return new _box as IMusicBox;
}
} [b]Simple_Factory.as:[/b]
package
{
import com.showping.dp.IMusicBox;
import com.showping.dp.MusicBoxFactory;
import com.showping.dp.PianoBox;
import com.showping.dp.ViolinBox;
import flash.display.Sprite; public class Simple_Factory extends Sprite
{
private var _piano:PianoBox;
private var _violin:ViolinBox;
public function Simple_Factory()
{
playMusicBox(MusicBoxFactory.createMusicBox("PianoBox"));
playMusicBox(MusicBoxFactory.createMusicBox("ViolinBox"));
} private function playMusicBox(musicBox:IMusicBox):void
{
musicBox.play();
}
}
}AS3有个特点,就是不被引用的类是不会被编译的,这一点跟Java区别很大
所以在Simple_Factory类里加入了两个引用,看似多余,其实必要,不然程序会报错。