*工厂方法模式(factory)

  简单工厂模式每次添加新需求,不仅要添加类,还要修改工厂函数。每次都要修改两个地方,这样太麻烦了,工厂方法模式则可以解决这个问题。

  工厂方法模式本意是说将实际创建对象工作推迟到子类中。这样核心类就变成了抽象类,但避免有人忽略new关键字,我们采用安全模式类。而我们将创建对象的基类放在工厂方法类的原型中。

  

 1 // 工厂方法模式
 2 // 安全模式创建工厂类,避免有人没写new关键字的情况
 3 var Factory = function(type, content) {
 4     if(this instanceof Factory) {
 5         var s = new this[type](content);
 6     }else {
 7         return new Factory(type, content);
 8     }
 9 }
10 // 工厂原型中设置创建所有类型数据对象的基类
11 Factory.prototype = {
12     Java: function(content) {
13         this.content = content
14         console.log(this.content);
15     },
16     JavaScript: function(content) {
17         console.log(content);
18     },
19     UI: function(content) {
20         console.log(content)
21     },
22     PHP: function(content) {
23         console.log(content);
24     }
25 }
26 // 测试用例
27 var data = [
28     {type:'JavaScript', content:'JavaScript'},
29     {type:'Java', content:'Java'},
30     {type:'UI', content:'UI'},
31     {type:'PHP', content:'PHP'},
32 ]
33 for(var i=0; i<data.length; i++) {
34     Factory(data[i].type, data[i].content);
35 }

  这样如果想添加其他类,只需要在Factory这个工厂类的原型里面添加就可以了。

 

拓展:

  安全模式类式说可以屏蔽使用这对类的错误使用造成的错误。

  解决方案是在构造函数开始时先判断当前的this对象是不是类,如果是则通过new关键字创建对象;如果不是说明类在全局作用域中执行(通常情况下),那么既然在全局作用域中执行,当然this就会指向window(通常情况下,如非浏览器环境可为其他全局变量),这样就要重新返回新创建的对象了。

 

参考资料:《JavaScript设计模式》

posted on 2020-10-16 16:58  大黑ylx  阅读(112)  评论(0编辑  收藏  举报