创建型设计模式-抽象工厂模式
定义
通过对类的工厂抽象使其业务用于对产品类蔟的创建,而不用负责创建某一类产品的实例。
谈及抽象工厂模式,就必然需要说明下何谓抽象类呢?接触过面向对象编程的语言的人,比如java,c#等。应该都知道他们对于抽象类拥有着关键字abstract class,所谓抽象,就是父类抽象共通方法特性,但是具体实现由每个子类去实现该方式。 如果没有实现该父类的方法,则父类应该提示子类,其特性存在未实现的
抽象类说明 —————》代码示例
function AbstractClass (){
this.name = 'This is a abstractClass';
}
AbstractClass.prototype = {
getName : function(){
return new Error('抽象方法无法调用');
},
getInfo : function(){
return new Error('抽象方法无法调用');
}
}
抽象工厂模式
这里我直接板书书上案例进行说明。
//这里是一个抽象工厂方法,内部单纯的实现继承的方法。
let VehicleFactory = function (SubType, SuperType) {
if (typeof VehicleFactory[SuperType] === 'function') {
console.log(`That's true`);
// 缓存类
function F () {
};
F.prototype = new VehicleFactory[SuperType]();
SubType.constructor = SubType;
SubType.prototype = new F();
} else {
return new Error('未创建该对象');
}
}
// 小汽车的抽象类
VehicleFactory.Car = function () {
this.type = 'car';
}
VehicleFactory.Car.prototype = {
getPrice () {
return new Error('抽象方法不能调用');
},
getSpeed () {
return new Error('抽象方法不能调用');
}
}
// 公交车 抽象类
VehicleFactory.Bus = function () {
this.type = 'bus';
}
VehicleFactory.Bus.prototype = {
getPrice () {
return new Error('抽象方法不能调用');
},
getPassengerNumber () {
return new Error('抽象方法不能调用');
}
}
// 卡车 抽象类
VehicleFactory.Truck = function () {
this.type = 'truck';
}
VehicleFactory.Truck.prototype = {
getPrice () {
return new Error('抽象方法不能调用');
},
getTrainload () {
return new Error('抽象方法不能调用');
}
}
抽象方法的实现与调用
let BMW = function (price, speed) {
// 调用父类构造方法,这里书中是没有的,需要加上,不然无法获取父类的公有属性
VehicleFactory.Car.call(this);
this.price = price;
this.speed = speed;
}
VehicleFactory(BMW, 'Car'); //实现继承
// 重写父类原型对象的方法,注意我们需要先继承父类,
// 再重写父类的方法,否则你重写的方法会被父类所覆盖
BMW.prototype = {
getPrice () {
return this.price;
},
getSpeed () {
return this.speed;
}
}
let bmw = new BMW(100000, 9999);
console.log(bmw.getPrice()); // 100000
console.log(bmw.type); // car 父类公有属性
备注:抽象工厂模式是设计模式中最为抽象的一种,也是创建模式中唯一一种抽象化创建模式。该模式创建出的结果不是一个真实的对象实例,而是一个类蔟,它制定了类的结构,这也就区别了简单工厂模式创建单一对象,工厂方法模式创建多类对象。当然由于Javascript 中不支持抽象化创建和虚拟方法,所以导致这种模式无法像其他对象语言中应用的那么广泛。
参考书籍: 《JavaScript 设计模式》张容铭
同时大家也可参考这位读者的观后感