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;
       }
    

 

posted on 2016-05-04 19:19  CuriousZero  阅读(301)  评论(0编辑  收藏  举报

导航