这两种设计模式有一定的相似之处,都是按需要实例化对象。但是工厂方法的重用性更好、符合OOP的开放——关闭原则。
简单工厂小例:
public class Creator { public static function simpleFactory(product:String):IProduct{ if (product=="p1") { return new Product1(); } else if (product=="p2") { return new Product2(); } } }
简单工厂不容易扩展,如果需要加入新产品则必须对simpleFactory()方法进行修改。
工厂方法小例:产品接口IProduct.as
package{ public interface IProduct { function manipulate():void; } }
产品类1:Product1.as
package{
internal class Product1 implements IProduct {
public function manipulate():void{
trace("调用了Product1的manipulate()");
}
}
}
产品类2:Product2.as
package{ internal class Product2 implements IProduct { public function manipulate():void{ trace("调用了Product2的manipulate()"); } } }
抽象创建类:Creator.as,由于有了抽象创建类来统一按需来实例化产品,所以无论我们要加入多少新产品类,只要加上一个继承于抽象创建类的相应产品的创建类就可以了,这符合开放——关闭原则。
package { import flash.errors.IllegalOperationError; public class Creator { public function doStuff():void { var product:IProduct = this.factoryMethod(); product.manipulate();//具体产品调用其方法 } protected function factoryMethod():IProduct {//这就是“工厂方法”,负责“生产”产品 throw new IllegalOperationError("Abstract method:must be overridden in a subclass"); return null; } } }
创建产品1的类:CreatorA.as
package {
public class CreatorA extends Creator {
override protected function factoryMethod():IProduct {
trace("实例化了产品2");
return new Product1();
}
}
}
创建产品2的类:CreatorB.as
package {
public class CreatorB extends Creator {
override protected function factoryMethod():IProduct {
trace("实例化了产品2");
return new Product2();
}
}
}
文档类:Main.as
package { import flash.display.Sprite; public class Main extends Sprite { public function Main() { var cA:Creator = new CreatorA(); var cB:Creator = new CreatorB(); cA.doStuff(); cB.doStuff(); } } }
文档类会输出:
实例化了产品1
调用了Product1的manipulate()
实例化了产品2
调用了Product2的manipulate()
参考资料:《ActionScript 3.0 设计模式》 的工厂方法模式