抽象工厂模式笔记 1.抽象工厂模式创建多个抽象类,创建出的结果是一个类簇(这里是抽象类的集合) 2.抽象工厂中传入的父类是否是抽象工厂方法创建的抽象类进行判断,不是则抛出错误 3.子类通过抽象工厂方法(寄生式继承)继承父类(抽象工厂创建的抽象类)的属性和方法 原型式继承
1 function inheritobject(o){2 //声明一个过渡函数对象3 function F(){ 4 }5 //过渡原型对象继承父对象6 F.prototype=o;7 //返回过渡对象的一个实列,该实例的原型继承了父对象8 return new F();9 }
寄生式继承 继承原型
1 /* 2 *寄生式继承 继承原型 3 * 传递参数subclass 子类 4 * 传递参数superclass 父类 5 * */ 6 function inheritPrototype(subclass,superclass){ 7 //复制一份父类的原型副本保存在变量中 8 var p=inheritobject(superclass.prototype); 9 //修正因为重写子类原型导致子类的constructor属性被修改10 p.constructor=subclass;11 //设置子类原型12 subclass.prototype=p;13 }
抽象工厂方法
1 //抽象工厂方法2 var VehicleFactory=function(subtype,supertype){3 //supertype通过typeof判断是否是抽象工厂模式创建的抽象类4 if(typeof VehicleFactory[supertype] === 'function'){5 inheritPrototype(subtype,supertype);6 }else{7 throw new Error('未创建该抽象类');8 }9 }
抽象工厂方法创建抽象类
1 VehicleFactory.Car=function(){ 2 this.type='car'; 3 } 4 5 VehicleFactory.Car.prototype={ 6 getPrice:function(){ 7 return new Error("抽象方法不能调用"); 8 }, 9 getSpeed:function(){10 return new Error("抽象方法不能调用");11 },12 getColor:function(){13 return new Error("抽象方法不能调用");14 }15 }16 17 VehicleFactory.Bus=function(){18 this.type='bus';19 }20 VehicleFactory.Bus.prototype={21 getPrice:function(){22 return new Error("抽象方法不能调用");23 },24 getSpeed:function(){25 return new Error("抽象方法不能调用");26 }27 }
宝马汽车子类
1 var BMW =function(price,speed){ 2 this.price=price; 3 this.speed=speed; 4 } 5 //抽象工厂实现对Car抽象类 的继承 6 VehicleFactory(BMW,'Car'); 7 BMW.prototype.getPrice = function(){ 8 return this.price; 9 }10 BMW.prototype.getSpeed = function(){11 return this.speed;12 }
测试代码
1 var BMWObject = new BMW(100,100);2 console.log(BMWObject.getPrice());3 console.log(BMWObject.getColor());