Общий вид фабричного метода получается таким:

Код AS3:
package com.itechnica.svg.draw {
public class DrawingCommand {
public static const FILL:String = "F";
public static const STYLE:String = "S";
public static const MOVE:String = "M";
public static const LINE:String = "L";
public static const CURVE:String = "C";
public static function create(type:String, ...args):DrawingCommand {
switch (type) {
case FILL:
return new FillCommand(args[0], args[1]);
break;
case STYLE:
return new StyleCommand(args[0], args[1], args[2]);
break;
case MOVE:
return new MoveCommand(args[0], args[1]);
break;
case LINE:
return new LineCommand(args[0], args[1]);
break;
case CURVE:
return new CurveCommand(args[0], args[1], args[2], args[2]);
break;
default:
throw new Error("com.itechnica.svg.draw.DrawingCommand.create("+type+", ...args) - unknown type");
}
}
// switch (d[0]) {
// case FILL :
// drawTarget.beginFill(dp[0], dp[1]);
// break;
// case "S" :
// drawTarget.lineStyle(dp[0], dp[1], dp[2]);
// break;
// case "M" :
// drawTarget.moveTo(dp[0], dp[1]);
// break;
// case "L" :
// drawTarget.lineTo(dp[0], dp[1]);
// break;
// case "C" :
// drawTarget.curveTo(dp[0], dp[1], dp[2], dp[3]);
// break;
// }
}
}
И мы наметанным глазом видим, что по-сути, мы заменяем один нетипизированый доступ на другой.
В фабричный метод приходится передавать различные сущности в одних и тех же параметрах, а это неверно.
Поэтому отказываемся и от этого пути, и заходим с другой стороны: просто создаем классы команд с теми аргументами конструкторов, которые обеспечат должный уровень типизации.