简单工厂模式 --web
简单工厂模式的思想能够这样子理解设计模式
一个商店的售货员,你跟售货员买什么东西,售货员便拿出你要的东西给你函数
那在代码里怎么构建这个过程呢this
首先,你须要有商品,让售货员有物品能够出售spa
这也就是你的功能需求,这里须要假设有三个需求,分别是得到一支笔,一张纸,一块橡皮prototype
那咱们先在代码里建立这三个商品类:设计
var pen = function(){ alert("你获得了一只笔"); } var paper = function(){ alert("你获得了一张纸"); } var rubber= function(){ alert("你获得了一块橡皮"); }
OK,三个商品类已经建立完成,售货员仓库里就拥有了三件可出售的物品code
那接下来咱们还须要创建一个售货员Shop,当调用Shop方法时,根据传入的参数决定拿出什么商品出来给客人对象
在Shop方法里定义售货员和商品间的联系,从而让售货员有权限出售仓库里拥有的物品blog
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