工厂模式就是用来创建对象的模式。分为:1.简单工厂;2.工厂方法;3.抽象工厂
1.简单工厂
let factory = function (type) {
function basketball() {
this.text = '篮球'
}
function football() {
this.text = '足球'
}
switch(type) {
case 'basketball':
return new basketball();
break;
case 'football':
return new football();
break;
default:
throw new Error('错误')
}
}
let basketball = factory('basketball');
let football = factory('football');
简单工厂就是根据参数不同生成不同的对象
2.工厂方法
let factory = function (type) {
if(this instanceof factory) {
var s = new this[type]();
return s;
} else {
return new factory(type);
}
}
factory.prototype = {
basketball: function() {
this.text = '篮球'
},
football: function() {
this.text = '足球'
}
}
let basketball = factory('basketball');
let football = factory('football');
简单工厂在做修改时需要修改两处而工厂方法只需要修改原型即可,工厂方法只做实例化
3.抽象工厂
let agency = function(subType, superType) {
//判断抽象工厂中是否有该抽象类
if(typeof agency[superType] === 'function') {
function F() {};
//继承父类属性和方法
F.prototype = new agency[superType] ();
//将子类的constructor指向子类
subType.constructor = subType;
//子类原型继承父类
subType.prototype = new F();
} else {
throw new Error('未创建抽象类!')
}
}
agency.car = function() {
this.type = 'car';
}
agency.car.prototype = {
getName: function() {
return new Error('抽象方法不能调用');
}
}
agency.bus = function() {
this.type = 'bus';
}
agency.bus.prototype = {
getName: function() {
return new Error('抽象方法不能调用');
}
}
var BMW = function (name) {
this.name = name
}
agency(BMW, 'car')
BAM.prototype.getName = function () {
return this.name
}
let carBMW = new BAM('宝马')
抽象工厂用来创建一类产品簇,子产品继承产品簇并重写必须函数,否则报错也是一直安全检验。

被折叠的 条评论
为什么被折叠?



