04.Javascript设计模式之简单工厂----SimpleFacotry
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。本文将用原生的Javascript语言来模拟简单工厂的设计模式。
问题的引入
以自行车为例,一辆自行车必经如下的四个阶段:组装、清洗、骑、维修,可以用下面的这个接口来表示:
var Bicycle = new Interface("Bicycle",["assemble","wash","ride","repaire"]);
也就是说,所有的自行车都必须经历这四个阶段,意即所有的自行车类,都是接口Bicycle的实现类,如Speedster牌的自行车,类表示时,Speedster中必须包含如上几口中的四个方法,代码表示为:
var Speedster = function(){}; Speedster.prototype = { assemble : function(){}, wash : function(){}, ride : function(){}, repaire : function(){} };
其中隐藏的代码实现为:
var Speedster = function(){}; //下面的这句代码是必须的 implements(Speedster,Bicycle);//implements方法请参见前序章节“JavaScript之接口----interface”
假如你想开几个自行车商店,每个商店都有几种型号(Speedster、Lowrider、ComfortCruiser)的自行车出售,那么这个自行车商店该怎样来模拟呢?
通常的实现模式
var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function(model){ var bicycle; //生产自行车 switch(model){ case "speedster": bicycle = new Speedster(); break; case "lowrider": bicycle = new Lowrider(); break; case "comfort cruiser": default : bicycle = new ComfortCruiser(); } //自行车组装 bicycle.assemble(); //自行车清洗 bicycle.wash(); return bicycle; } }; //出售自行车 var bShop = new BicycleShop(); var newBicycle = bShop.sellBicycle("lowrider");
用上面的方式,我们就成功的出售了一辆“lowrider”牌的自行车。sellBicycle方法可以根据所要求的自行车型号用switch来创建一个自行车实例。
简单工厂模式
但是问题来了,如果你想在供货目录中假如一款新车该怎么办呢?你为了满足这个要求,不得不去改动BicycleShop的代码,即使其内部的实现逻 辑和实际功能完全没有变(依旧是根据用户的需求,创建一辆自行车、组装、清洗后,再交给用户)。考虑到这一点,我们需要对这个sellBicycle方法 做一个升级,把其中专门用于生产自行车功能的部分代码交给一个简单工厂来完成,该工厂只负责创建用户所需的自行车,这就是一个自行车工厂,代码模拟为:
var BicycleFactory = { createBicycle : function(model){ var bicycle; //生产自行车 switch(model){ case "speedster": bicycle = new Speedster(); break; case "lowrider": bicycle = new Lowrider(); break; case "comfort cruiser": default : bicycle = new ComfortCruiser(); } return bicycle; } };
非常容易的可以从代码看出,这个自行车工厂只做一件事,就是根据用户的需求,创建自行车。
这样一来,我们的自行车商店就可以模拟成这样了:
var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function(model){ //这里是改动之处 var bicycle = BicycleFactory.createBicycle(model); //下面的代码仍然没有变 //自行车组装 bicycle.assemble(); //自行车清洗 bicycle.wash(); return bicycle; } }; //出售自行车 var bShop = new BicycleShop(); var newBicycle = bShop.sellBicycle("lowrider");
这样一来,生产自行车的工作就交给了专门的工厂来完成了,就算这个时候需要一辆新型号的自行车,比如“Alien”牌的,那么只需要在BicycleFactory中增加两行代码即可:
var BicycleFactory = { createBicycle : function(model){ var bicycle; //生产自行车 switch(model){ case "speedster": bicycle = new Speedster(); break; case "lowrider": bicycle = new Lowrider(); break; case "Alien": //这里是新添加的自行车型号 bicycle = new Alien(); break; case "comfort cruiser": default : bicycle = new ComfortCruiser(); } return bicycle; } };
这样的修改,对自行车商店来说,是没有任何影响的,非常友好的将产品提供给了用户。
这是一个非常典型的简单工厂设计模式的例子。主要参考文献:《Javascript设计模式》 Ross Harmes,Dustin Diaz
若有模拟不当或阐述不清之处,还请见谅,谢谢!