简单工厂模式(easy factory pattern)
工厂模式的优点:
1.工厂模式可以降低模块间的耦合性,使用工厂模式创建一个对象,不需要知道创建该对象的过程和必要信息,只需要提供一个约束条件(例如:一些类名,一些协定的指令等等)就可以获取需要的对象。
2.工厂模式有一定的良好扩展性
3.屏蔽其它产品类,调用者只需要关心产品类接口(指令),因为产品类是由工厂对象实例产生的。如(var factoryMethod = new FactoryMediator("指令"))
工厂模式的应用场景:
1.工厂模式是自己new一个对象代替方案,但不是绝对的。增加工厂会增加系统发复杂性。(如:new FactoryMethod("指令"),指令控制工厂生产的产品)
2.需要灵活、有良好可扩展性。因为工厂模式屏蔽了产品,调用者只关心的是产品接口的命令(指令)而不是实现,在不改变接口的情况下,增加一种产品仅仅是只需要实现产品接口就可以了。例如:游戏里面同一个场景有NPC,主角。这几种角色只需要实现同一个接口(例如IPlayer),若以后出现新游戏角色怪物只需要实现IPlayer,该游戏系统就可以完美支持新协议了。
工厂方法的通用类:
抽象角色 <------ 具体角色-------->具体工厂---------->抽象工厂(factoryMediator)
抽象产品角色:定义产品的共性,实现实物最抽象的定义(如:IPlayer拥有血量,攻击力,角色图片,角色名字等等)
抽象工厂角色:定义一个用于创建对象的接口,具体如何创建对象是由具体工厂实现。
具体角色:实现抽象角色所定义的接口。
具体工厂:实现创建对象的接口。
(注:流程图解释如下:具体工厂实现抽象工厂里面的方法属性并且实现具体角色的创建、具体角色拥有抽象角色的所有属性方法等)
工厂方法通用代码:
抽象工厂:具有创建角色的方法createPlayer(instruct:String):IPlayer;
1 package 2 { 4 public interface IFactory 5 { 6 function createPlayer(instruct:String):IPlayer; 7 } 8 }
具体工厂:实现抽象方法,创建工厂同时添加角色(如:NPC,角色,怪物等等)
1 package 2 { 3 import flash.utils.Dictionary; 4 5 public class Factory implements IFactory 6 { 7 private var player:Dictionary = null; 8 9 public function Factory() 10 { 11 player = new Dictionary(true); 12 player["player"] = Player as Class; 13 } 14 15 public function createPlayer(instruct:String):IPlayer 16 { 17 return new player[instruct](); 18 } 19 20 } 21 }
抽象角色:具有跑步方法function run():void;
1 package 2 { 3 public interface IPlayer 4 { 5 function run():void; 6 7 } 8 }
具体角色:实现跑步方法public function run():void
1 package 2 { 3 public class Player implements IPlayer 4 { 5 public function Player() 6 { 7 8 } 9 10 public function run():void 11 { 12 //..省略千行跑步代码 13 trace("跑步"); 14 } 15 } 16 }
具体场景:运行提取该角色
1 package 2 { 3 import flash.display.Sprite; 4 5 /** 6 * @author 小雄 7 */ 8 [SWF(backgroundColor = "#FFFFFF",width="1680",height="1050")] 9 public class Main extends Sprite 10 { 11 public function Main() 12 { 13 var iplayer:IPlayer = new Factory().createPlayer("player"); 14 iplayer.run(); 15 } 16 17 } 18 }
运行输出结果:跑步
尝试添加一个NPC,指令为NPC,NPC类实现IPlayer,工厂里面添加player["NPC"] = NPC as Class;只需要在new Factory().createPlayer("player");以上实例虽说简单工厂,但是具备复杂工厂的能力。不论多少个工厂,可以根据指令实现。