抽象工厂模式笔记
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());