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

posted @ 2016-03-17 16:55  小疯纸的yy  阅读(368)  评论(0编辑  收藏  举报