一、模式概念解读
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; }