工厂方法模式与简单工厂

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

 

posted @ 2010-11-09 12:38  hotcho  阅读(309)  评论(0编辑  收藏  举报