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 设计模式》  的工厂方法模式

  • 相关阅读:
    背景样式、列表样式、变形样式、过渡动画
    边框样式、段落样式、背景样式
    属性选择符、字体样式和元素样式
    Targets选项下Other linker flags的设置
    OC金额转大写
    输入手机号码 和 金额有效性的判断
    iOS手势冲突问题
    解决iOS手势冲突问题
    iOS开发 字符串的转化 小技巧
    iOS开发添加pch文件
  • 原文地址:https://www.cnblogs.com/cos2004/p/1872488.html
Copyright © 2011-2022 走看看