抽象工厂模式(Abstract Factory)
通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。
⚠ 注意:
抽象方法只负责告诉开发者要实现什么方法,并不负责真正的逻辑处理,可以理解为子类要实现所定义功能的模板
示例:
// 抽象类
/**
* 抽象工厂方法 - 寄生式继承
* @param {Class} subType 子类
* @param {Class} superType 父类
*/
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('未创建该抽象类');
}
}
/**
* 小汽车父抽象类
* 如果定义的子类继承自小汽车就需要实现 getPrice getSpeed 方法,否则调用报错
*/
VehicleFactory.Car = function () {
this.type = '【父类】小汽车'; };
VehicleFactory.Car.prototype.getPrice = function () {
return new Error('您尚未定义此方法,请定义后在调用!'); };
VehicleFactory.Car.prototype.getSpeed = function () {
return new Error('您尚未定义此方法,请定义后在调用!'); };
/**
* 公交车父抽象类
* 如果定义的子类继承自公交车就需要实现 getPrice getPassengerNum 方法,否则调用报错
*/
VehicleFactory.Bus = function () {
this.type = '【父类】公交车'; };
VehicleFactory.Bus.prototype.getPrice = function () {
return new Error('您尚未定义此方法,请定义后在调用!'); };
VehicleFactory.Bus.prototype.getPassengerNum = function () {
return new Error('您尚未定义此方法,请定义后在调用!'); };
// 实例1:
/**
* 宝马 - 小汽车的子类
* @param {number} price 价格(单位万)
* @param {number} speed 速度(单位km/h)
*/
let BMW = function (price, speed) {
this.type = '【子类】宝马';
this.price = price;
this.speed = speed;
};
VehicleFactory(BMW, 'Car'); // 'Car' ---> VehicleFactory.Car
BMW.prototype.getPrice = function () {
return this.price; };
let bmw = new BMW(30, 120);
console.log(bmw.getPrice()); // 30
console.log(bmw.getSpeed()); // Error: 您尚未定义此方法,请定义后在调用!
// 实例2:
/**
* 兰博基尼 - 小汽车的子类
* @param {number} price 价格(单位万)
* @param {number} speed 速度(单位km/h)
*/
let Lamborghini = function (price, speed) {
this.type = '【子类】兰博基尼';
this.price = price;
this.speed = speed;
};
VehicleFactory(Lamborghini, 'Car'); // 'Car' ---> VehicleFactory.Car
Lamborghini.prototype.getPrice = function () {
return this.price; };
Lamborghini.prototype.getSpeed = function () {
return this.speed; };
let lamborghini = new Lamborghini(130, 260);
console.log(lamborghini.getPrice()); // 130
console.log(lamborghini.getSpeed()); // 260
// 实例3:
/**
* 宇通客车 - 公交车的子类
* @param {number} price 价格(单位万)
* @param {number} count 限乘(单位人)
*/
let Yutong = function (price, count) {
this.type = '【子类】宇通客车';
this.price = price;
this.count = count;
};
VehicleFactory(Yutong, 'Bus'); // 'Bus' ---> VehicleFactory.Bus
Yutong.prototype.getPrice = function () {
return this.price; };
Yutong.prototype.getPassengerNum = function () {
return this.count; };
Yutong.prototype.getOtherFun = function () {
return '其他方法···'; };
let yutong = new Yutong(15, 24);
console.log(yutong.getPrice()); // 15
console.log(yutong.getPassengerNum()); // 24
console.log(yutong.getOtherFun()); // 其他方法···