用星际学习设计模式之一(actionscript3版):工厂方法模式的学习
广告时间
|
|
||||||||||
早几天看了一下设计模式的简单工厂模式,这两天再看工厂方法模式,感觉虽然第一次接触设计模式,但简单看了一下后发现,原来自己曾经的有些思路正和设计模式中所做的一样,正如有人所说的,设计模式并不是一个新的东西,而是总结一下你程序设计中的思路。
再接再厉,接下分享下我看工厂方法模式的心得吧!
上次的简单工厂模式解决了根据传入的参数动态返回对象的问题,一个兵工厂里面可以根据你传入的参数来返回marine或者是fireman,而大多数时候,我们并不是直接返回参数,而需要对传回的参数进入判断,或者是判断是否满足实例化对象的条件,在星际中,制造机枪兵或者火焰兵是需要判断资源是否足够,这些都可以放在工厂类中,但这样会造成代码的臃肿,我对快刀浪子的一名话印象深刻,大意是每个类需要有其生成,销毁等等所有的方法,使用时只管实例化,根据上面两个思路,我们将判断资源的代码分别放在两个独立的具体的工厂当中,负责真正的新建对象的任务。主工厂负责分配任务。
先看思路:简单工厂模式中的工厂类(兵种制造器的类)保持不变,增加一个制造接口,定义一个实际制造对象的方法,然后定义各个具体制造不同对象的工厂,同时要求这些工厂执行这个制造接口,让这些工厂去实现实际制造对象的方法。
再看代码:
Main.as
/*
原载于:http://www.askgame.com.cn
癫狂蚊子
*/
package {
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.text.TextField;
public class Main extends MovieClip {
public static var ore:int=1000;
public static var gas:int=200;
//生产兵的种类
var type:String="";
//生成制造工厂
var barrack:Barrack=new Barrack();
public function Main():void {
stage.addEventListener(KeyboardEvent.KEY_DOWN,createHandle);
}
private function createHandle(e:KeyboardEvent):void {
type=String.fromCharCode(e.charCode);
var product=barrack.create(type);
if(product!=null) stage.addChild(product);
}
}
}
主工厂类及具体工厂类Barrack.as
public class Barrack {
//maxRow:360/30-1=11;maxCol:150/30-1=4
private var row:int=0;
private var col:int=0;
public function create(type:String):DisplayObject {
var productFactory;
var product;
switch (type) {
case "m" :
productFactory=new MarineFactory();
break;
case "f" :
productFactory=new FiremanFactory();
break;
default :
return null;
}
//设定坐标
product=productFactory.beginCreate();
if(product==null){
return null;
}
product.x=row*30;
product.y=col*30;
row++;
if (row>11) {
row=0;
col++;
}
return product;
}
}
}
import flash.display.DisplayObject;
interface abstractCreator{
function beginCreate():DisplayObject;
}
//下面的类为具体的生产工厂
class MarineFactory implements abstractCreator{
public function beginCreate():DisplayObject{
if(Main.ore>50){
Main.ore-=50;
return new Marine();
}
return null;
}
}
class FiremanFactory implements abstractCreator{
public function beginCreate():DisplayObject{
if(Main.ore>50&&Main.gas>25){
Main.ore-=50;
Main.gas-=25;
return new Fireman();
}
return null;
}
}
示例及源码下次奉上~


