js设计模式之工厂模式(一)
简单工厂模式 --
简单工厂模式的思想可以这样子理解
一个商店的售货员,你跟售货员买什么东西,售货员便拿出你要的东西给你
那在代码里怎么构建这个过程呢
首先,你需要有商品,让售货员有物品可以出售
这也就是你的功能需求,这里需要假设有三个需求,分别是获得一支笔,一张纸,一块橡皮
那我们先在代码里创建这三个商品类:
var pen = function(){
alert("你得到了一只笔");
}
var paper = function(){
alert("你得到了一张纸");
}
var rubber= function(){
alert("你得到了一块橡皮");
}
OK,三个商品类已经创建完成,售货员仓库里就拥有了三件可出售的物品
那接下来我们还需要建立一个售货员Shop,当调用Shop方法时,根据传入的参数决定拿出什么商品出来给客人
在Shop方法里定义售货员和商品间的联系,从而让售货员有权限出售仓库里拥有的物品
var Shop = function(goods){ switch(goods){ case "pen": return new pen(); case "paper": return new paper(); case "rubber": return new rubber(); } }
这样,售货员建立完,我们就可以通过调用售货员拿到仓库里面的各种商品,出售给客人
var pen = Shop("pen"); //你得到了一只笔 var paper = Shop("paper"); //你得到了一张纸 var rubber = Shop("rubber"); //你得到了一块橡皮
简单工厂模式比较适合在一些需求明确的情况下使用
可当遇到一些需求不明确的情况,后续有源源不断的功能要求,那我们又改怎么加商品进去仓库呢?
例如:售货员的商店每隔几天就会有新的商品进来,每增加一件商品,我们就得再写一个商品类,还有得在售货员这边增加录入售货员与商品类的联系,
这样两头改一方面麻烦,一方面会加大bug出现的几率
另一种工厂模式的实现--
首先同样创建一个售货员+仓库类
var Shop = function(goods){ if(this instanceof shop){ //防止使用shop的时候将shop直接当成函数使用 return new this[goods](); }else{ return new shop(goods); } }
接下来则创建商品类,放在类原型中,原型即仓库
Shop.prototype={ pen:function(){ alert("你得到了一只笔"); }, paper:function(){ alert("你得到了一张纸"); }, rubber:function(){ alert("你得到了一块橡皮"); } }
获取商品
var pen = new Shop('pen'); //你得到了一只笔 var paper = new Shop('paper'); //你得到了一只笔 var rubber = new Shop('rubber'); //你得到了一只笔 var pens = Shop('pen'); //你得到了一只笔 var papers = Shop('paper'); //你得到了一只笔 var rubbers = Shop('rubber'); //你得到了一只笔
使用该工厂模式,即使后面需求再修改,不断有新的需求过来,只需要将商品扔进仓库,售货员便知道且可以出售
突然有一天,售货员觉得得给自己的商品都打上自己店的标志,这样别人看到了就知道东西是从自家店里买的
于是他便给每一个商品都贴上了属于自己店的标签
这样每一个商品都有一个共同的属性,都是从售货员店里出来的
使用前两种模式,都要在每个商品里加上一个同样的属性,这样不利于代码的重复利用,于是便有了下面这种模式
共有属性--工厂模式
建立一个商店类
function Shop(goods){ var obj = new Object(); //空对象 obj.source = "售货员店"; switch(goods){ case 'pen': alert("你得到了一只笔,来自售货员店"); break; case 'paper': alert("你得到了一张纸,来自售货员店"); break; case 'rubber': alert("你得到了一块橡皮,来自售货员店"); break; } return obj; }
获取商品
var pen = Shop("pen"); //你得到了一只笔,来自售货员店 var paper = Shop("paper"); //你得到了一张纸,来自售货员店 var rubber = Shop("rubber"); //你得到了一块橡皮,来自售货员店
这种模式下,所有通过Shop方法得到的实例都拥有source这个属性
实现简洁代码,不过这种模式的缺点是没办法判断事例是否属于某个类
设计模式应用应按需选择,没有一成不变的模式
不对之处请指正
个人原创,转载请注明来源
博客:http://www.cnblogs.com/alex-web/
注:小疯纸的yy