面向对象之工厂模式与构造函数模式的区别

工厂模式

  工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象。其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可。

 1 function createBlog(name, url) {
 2   var o = new Object();
 3   o.name = name;
 4   o.url = url;
 5   o.sayUrl= function() {
 6     alert(this.url);
 7   }
 8   return o;
 9 }
10  
11 var blog1 = createBlog('wuyuchang', 'http://www.jb51.net/');

可以看到工厂模式的实现方法非常简单,解决了创建多个相似对象的问题,但是工厂模式却无从识别对象的类型,因为全部都是Object,不像Date、Array等,因此出现了构造函数模式。

构造函数模式

  ECMAScript中构造函数可以创建特定类型的对象,类似于Array、Date等原生JS的对象。其实现方法如下:

 1   function Blog(name, url) {
 2     this.name = name;
 3     this.url = url;
 4     this.alertUrl = function() {
 5       alert(this.url);
 6     }
 7   }
 8   var blog = new Blog('wuyuchang', 'http://www.jb51.net/');
 9   //即为Blog的实例,也为Object的实例
10   console.log(blog instanceof Blog);  // true 
11   console.log(blog instanceof Object);  // true
 
构造函数与工厂函数之间差异:
1.工厂函数需要创建对象,以及必须有返回值
2.工厂函数针对的都是Object的对象模型,而构造函数可以匹配自定义的对象模型
  即前者不论创建什么都只有一个xx instanceof Object
  而后者根据自定义名而定类型,如上举例所示
3.构造函数弊端,如果在全局中定义相同的局部变量,容易造成全局污染,因为this.xx如果在局部获取不到,就会去全局中获取
4.构造函数可以重写,可以在全局中添加新属性和方法Person.prototype = {},但工厂函数只能在局部添加
 
各自适用场合:
  构造函数:适应用于大型项目,属性以及方法时常变换的项目
  工厂函数:适应用于小型项目,或者正在制作过程还没有成型的项目
 
 
参考了一些资料,以及个人的一点见解,希望能帮忙补充~~~
原文地址:https://www.cnblogs.com/laoniaofly/p/5945744.html