简单工厂模式每次添加新需求,不仅要添加类,还要修改工厂函数。每次都要修改两个地方,这样太麻烦了,工厂方法模式则可以解决这个问题。
工厂方法模式本意是说将实际创建对象工作推迟到子类中。这样核心类就变成了抽象类,但避免有人忽略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设计模式》