工厂方法模式与简单工厂
这两种设计模式有一定的相似之处,都是按需要实例化对象。但是工厂方法的重用性更好、符合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 设计模式》 的工厂方法模式

浙公网安备 33010602011771号