/*
抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类族的创建,而不负责创建某一类产品的实例;
出现的都是幻觉--抽象工厂方法
*/
/* 例子:
我们定义一个类,在类的原型上定义了来个方法,但是在调用的时候会报错,
但是在被子类继承后可以进行重写这些方法
*/
/* var Car = function () { }
Car.prototype = {
getPrice: function () {
return new Error("抽象方法不能被调用")
},
getSpeed: function () {
return new Error("抽象方法不能被调用")
}
}
*/
/*
抽象工厂方法:我们用它作为父类来创建子类,也就是说这个工厂里面的方法都是无法被使用的,
只能是被继承然后在子类中被修改;不能用它来创建一个真实的对象
例子:
*/
/*
抽象工厂方法:
其实是一个实现子类继承父类的方法。在这个方法中我们需要通过传递子类以及要继承的父类的名称,
并且在抽象工厂方法中又添加了一次对抽象类存在性的判断,如果存在则将子类继承父类的方法,
然后子类通过寄生式继承,继承父类的过程中还有一个地方需要注意,就是在过渡类的原型继承时,我们不是继承
父类的原型,而是通过new关键字复制父类的一个实例,这么做是因为过度类不仅仅继承弗雷德原型方法还要继承
父类的对象属性,所以要通过new关键字将父类的构造函数执行一遍来复制构造函数中的属性和方法,对抽象工厂添加
抽象类也很特殊,因为抽象工厂是个方法,不需要实例化,故只需要一份,因此直接为抽象工厂添加类的属性即可,
*/
/*
抽象工厂的作用是知道每个子类到底是哪一种类别的,然后他们也具备了该类所必备的属性和方法
*/
var VehicleFactory = function (subType, superType) {
//判断抽象工厂中是否有这个抽象的类
if (typeof VehicleFactory[superType] === 'function') {
//缓存类
function F() { };
//继承父类属性和方法
F.prototype = new VehicleFactory[superType]();
//将子类constructor指向子类
subType.constructor = subType;
subType.prototype = new F();
} else {
//不存在该抽象类跑出错误
throw new Error("未创建该抽象类")
}
}
//小汽车抽象类
VehicleFactory.Car = function () {
this.type = 'car'
}
VehicleFactory.Car.prototype = {
getPrice: function () {
return new Error("抽象方法不能被调用")
},
getSpeed: function () {
return new Error("抽象方法不能被调用")
}
}
//公共汽车类
VehicleFactory.Bus = function () {
this.type = 'bus'
}
VehicleFactory.Bus.prototype = {
getPrice: function () {
return new Error("抽象方法不能被调用")
},
getSpeed: function () {
return new Error("抽象方法不能被调用")
}
}
//卡车汽车类
VehicleFactory.Truck = function () {
this.type = 'Truck'
}
VehicleFactory.Truck.prototype = {
getPrice: function () {
return new Error("抽象方法不能被调用")
},
getSpeed: function () {
return new Error("抽象方法不能被调用")
}
}
//宝马汽车子类
var BMW = function (price, speed) {
this.price = price;
this.speed = speed;
}
//抽象工厂实现对于car抽象类的继承
VehicleFactory(BMW, "Car")
BMW.prototype.getPrice = function () {
return this.price;
}
BMW.prototype.getSpeed = function () {
return this.speed;
}
var b = new BMW(100, 100);
console.log(b.getPrice())