抽象工厂模式
-
概念
抽象工厂模式就是通过对类的工厂抽象使其业务用于对产品类簇的创建而不负责创建某一类产品的实例。
因为javascript中abstract还是一个保留字,所以目前来说还不能像传统面向对象语言那样轻松地创建。抽象类是一种声明但不能使用的类,当你使用的时候会报错,但是我们可以在类的方法中手动的抛出错误来模拟抽象类。 -
抽象工厂模式例子
在javascript中,大多数的工厂都是用来创建对象的,但是抽象工厂模式一般不用来创建具体的对象,因为抽象类中定义的方法只是显性的定义了一些功能,但没有具体的实现,而一个对象是具有一套完整的功能的,所以抽象类不能用来创建一个真实 的对象。所以我们一般用他的父类来创建一些子类。如://抽象工厂方法 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('抽象方法不能调用'); } } //公交车抽象类(略) //货车抽象类(略) //抽象和实现 //宝马汽车子类 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 car1 = new BMW(1000,100); console.log(car1.getPrice());//1000
抽象工厂实际是一个实现子类继承父类的方法,在这个过程中我们需要通过传递子类以及要继承父类(抽象类)的名称,并且在抽象工厂的方法中又增加了一次对抽象类存在性的判断。通过抽象工厂,我们就能知道每个子类到底是哪一类别了,然后他们也具备了该类所具备的属性和方法。