目的:对子类实现进行规范,防止因子类没实现调用了父类的方法,所以当调用父类方法时,抛出异常
// 抽象工厂模式
var VehicleFactory = function (subType, superType) {
// 判断抽象工厂中是否有该抽象类
if (typeof VehicleFactory[superType] === 'function') {
// 缓存类
// 方法一:使用Object.create创建,但是会无法继承夫类的属性,读取bmw.type时,会出现undefined
//subType.prototype = Object.create(VehicleFactory[superType].prototype)
// 方法二:使用new关键字创建
subType.prototype = new VehicleFactory[superType]()
// 方法三:分别继父类原型和子类构造器
// function F(){}
// F.prototype = new VehicleFactory[superType]()
// 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
}
// 通过工厂创建子类
VehicleFactory(BMW, 'Car')
BMW.prototype.getPrice = function () {
return this.price
}
BMW.prototype.getSpeed = function () {
return this.speed
}
// 兰博基尼
var Lamborghini = function(price, speed) {
this.price = price
this.speed = speed
}
VehicleFactory(Lamborghini, 'Car')
Lamborghini.prototype.getPrice = function () {
return this.price
}
Lamborghini.prototype.getSpeed = function () {
return this.speed
}
// 宇通汽车子类
var YUTONG = function(price, speed) {
this.price = price
this.speed = speed
}
VehicleFactory(YUTONG, 'Bus')
YUTONG.prototype.getPrice = function () {
return this.price
}
// 子类没有实现父类的方法
// YUTONG.prototype.getSpeed = function () {
// return this.speed
// }
var bmw = new BMW(100, '100km')
var lambo = new Lamborghini(300, '300km')
var yutong = new YUTONG(500, '200km')
console.log(bmw.getPrice()) // 100
console.log(bmw.getSpeed()) //100km
console.log(bmw.type) // Car
console.log(lambo.getPrice()) // 300
console.log(lambo.getSpeed()) // 300km
console.log(yutong.getPrice()) // 500
console.log(yutong.getSpeed()) // Error
网友评论