• JavaScript 设计模式之工厂模式


    一、模式概念解读

       1.工厂模式概念文字解读

      工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型(抽象工厂)。

      这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,会经常在程序里看到工厂方法,用于让子类定义需要创建的对象类型。

       2.工厂模式概念拟物化解读

       一个工厂有做鞋子的、有做衣服的,工人不一定直接做鞋子,而是通过厂长等,由厂长布置产品线。而外部使用者不需要管产品线是怎么样的,只要结果就好。

        

    二、工厂模式的作用和注意事项

       模式作用:

        1.对象的构建十分复杂。

        2.需要依赖具体的环境创建不同的实例。

        3.处理大量具有相同属性的小对象。

      注意事项:

        1.不能滥用工厂,有时候仅仅是给代码增加复杂度。

    三、模式的代码实战和总结

     1.一个实例

    代码如下:

    <meta charset="utf-8"/>
    <script type="text/javascript">
        //1.工厂应该有厂长,来决定到底运行哪一条产品线
        //但厂长不是最终的决策者,消费者才是。消费者->子类
        
        //工厂
        var factory={}; 
        //工厂做衣服
        factory.makeClothing=function(argument){
            this.worker=50; //有50个工人
            //alert('我们有'+this.worker);
        }
        //工厂做鞋子
        factory.makeShoes=function(){
            alert('做鞋子');
        }
        //工厂的运输
        factory.transportation=function(){
            alert('运输');
        }
        //工厂的厂长
        factory.director=function(para){
            //这里为什么用new? 上面我们使用了构造函数模式(var factory={}; //工厂)和单例模式(this.worker=50; //有50个工人)
            return new factory[para]();
        }
        //我找到工厂的厂长,告知要生产衣服
        var me =factory.director('want make clothing ');
        alert(me.worker);
    
    </script>

    2.两个js例子

    //JS_factory-simple.js
    //这是一个简单工厂模式
    var XMLHttpFactory = function(){
    
    }
    XMLHttpFactory.createXMLHttp =function(){
        var XMLHttp =null;
        //XMLHttpFactory.createXMLHttp () 这个方法根据当前环境的具体情况返回一个XHR对象。
        if (window.XMLHttpRequest) {
            XMLHttp = new XMLHttpRequest()
        }
        elseif(window.ActiveXObject){
            XMLHttp = new ActiveXObject("Microsoft.XMLHttp")
        }
        return XMLHttp;
    };
    var AjaxHander = function(){
        var XMLHttp =XMLHttpFactory.createXMLHttp();  /*..具体的操作..*/
    }
    //只关心得到的东西是什么
    //JS_factory-abstract.js
    //这是一个抽象工厂模式
    var XMLHttpFactory = function(){
    
    }
    XMLHttpFactory.prototype ={ 
        //如果真的要调用这个方法会抛出一个错误,它不能被实例化,只能用来派生子类
        createFactory:function(){
            throw new Error('This is an abstract class');
        }
    }    //派生子类
    
        var XHRHandler =function(){
            XMLHttpFactory.call(this);
        };
    
        XHRHandler.prototype=new XMLHttpFactory();
        XHRHandler.prototype.constructor=XHRHandler; //重新定义createFactory 方法
    
        XHRHandler.prototype.createFactory=function(){
            var XMLHttp =null;
            //XMLHttpFactory.createXMLHttp () 这个方法根据当前环境的具体情况返回一个XHR对象。
            if (window.XMLHttpRequest) {
               XMLHttp = new XMLHttpRequest()
            }
            elseif(window.ActiveXObject){
              XMLHttp = new ActiveXObject("Microsoft.XMLHttp")
             }
             return XMLHttp;
           }
        
  • 相关阅读:
    分析建模中的行为分析
    SOLID总结(未完待续)
    分析建模的五个子过程中为什么有个编码子过程?
    用例建模的五个子过程
    类之间的关系
    python cx_Freeze安装详解、打包exe文件简解
    pyautoit:OSError: [WinError 193] %1 不是有效的 Win32 应用程序
    Python 动态导入类并运行其中的方法
    比较2个字符串,输出看起来一样,但比较起来不同
    pyautogui 文档(五):截图及定位功能
  • 原文地址:https://www.cnblogs.com/shenxiaolin/p/5459529.html
Copyright © 2020-2023  润新知