上一篇文章说到了简单工厂模式,这种模式常规情况下是比较实用的,没有多大问题。但是某些情况下就会出现代码不好维护的问题。
比如说有一个工厂是组装汽车的,这个工厂又比较大,什么汽车都组装,那么就需要创建很多中汽车类,比如:
function Nissan() {
this.color = 'white';
this.price = 12345;
}
function Volkswagen() {
this.color = 'black';
this.price = 11115;
}
function Tesla() {
this.color = 'green';
this.price = 12215;
}
//...
//问题出现了:有多少中车就需要创建多少个类在全局window中,这样会严重污染全局环境。
//而且当某人新建了一个同名变量或者类,那就更加悲剧,直接覆盖之前的代码……
所以这里应该需要重新改变其工厂编写代码的模式,暂且命名为 组合工厂模式 吧。
var CarFactory = function (type) {
if (this.constructor === CarFactory) { //这里的目的是,判断当前是否为 new 的对象,如果使用的是new,那么这里就为true
return new this[type];
} else { //否则就是直接当作函数调用,那么做一个兼容。当使用函数调用的时候,我们在内部new一个对象
return new CarFactory(type);
}
}
CarFactory.prototype = {
Nissan: function () {
//...
},
Volkswagen: function () {},
Tesla: function () {}
//...
}
这样在全局中只暴露一个CarFactory这样一个方法或者类,减少了污染全局环境的情况,以后的新增也很方便,使用和之前也一样。
var nissan = new CarFactory('Nissan'); // var nissan = CarFactory('Nissan');
网友评论