简单工厂模式(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");
以上实例虽说简单工厂,但是具备复杂工厂的能力。不论多少个工厂,可以根据指令实现。