zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Python学习——模块的基本知识
    Python学习-软件目录结构规范
    路径追踪的理论与实现:复合重要性采样
    路径追踪的理论与实现:渲染方程
    记一个C++随机数导致的bug
    Gamma矫正的原理和实现
    聊一聊Python的sort函数
    BVH树的构建与遍历
    Cocos动画系统
    Cocos事件分发系统
  • 原文地址:https://www.cnblogs.com/alex-web/p/5287532.html
Copyright © 2011-2022 走看看