zoukankan      html  css  js  c++  java
  • 工厂方法模式与简单工厂

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

  • 相关阅读:
    【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
    【POJ 2187】Beauty Contest 凸包+旋转卡壳
    1056: [HAOI2008]排名系统
    1874: [BeiJing2009 WinterCamp]取石子游戏
    1055: [HAOI2008]玩具取名
    2338: [HNOI2011]数矩形
    1060: [ZJOI2007]时态同步
    1054: [HAOI2008]移动玩具
    1053: [HAOI2007]反素数ant
    1052: [HAOI2007]覆盖问题
  • 原文地址:https://www.cnblogs.com/cos2004/p/1872488.html
Copyright © 2011-2022 走看看