编程爱好者联盟 2016-10-20
抽象工厂模式笔记 1.抽象工厂模式创建多个抽象类,创建出的结果是一个类簇(这里是抽象类的集合) 2.抽象工厂中传入的父类是否是抽象工厂方法创建的抽象类进行判断,不是则抛出错误 3.子类通过抽象工厂方法(寄生式继承)继承父类(抽象工厂创建的抽象类)的属性和方法 原型式继承
function inheritobject(o){ //声明一个过渡函数对象 function F(){ } //过渡原型对象继承父对象 F.prototype=o; //返回过渡对象的一个实列,该实例的原型继承了父对象 return new F(); }
寄生式继承 继承原型
/* *寄生式继承 继承原型 * 传递参数subclass 子类 * 传递参数superclass 父类 * */ function inheritPrototype(subclass,superclass){ //复制一份父类的原型副本保存在变量中 var p=inheritobject(superclass.prototype); //修正因为重写子类原型导致子类的constructor属性被修改 p.constructor=subclass; //设置子类原型 subclass.prototype=p; }
抽象工厂方法
//抽象工厂方法 var VehicleFactory=function(subtype,supertype){ //supertype通过typeof判断是否是抽象工厂模式创建的抽象类 if(typeof VehicleFactory[supertype] === 'function'){ inheritPrototype(subtype,supertype); }else{ throw new Error('未创建该抽象类'); } }
抽象工厂方法创建抽象类
VehicleFactory.Car=function(){ this.type='car'; } VehicleFactory.Car.prototype={ getPrice:function(){ return new Error("抽象方法不能调用"); }, getSpeed:function(){ return new Error("抽象方法不能调用"); }, getColor:function(){ return new Error("抽象方法不能调用"); } } VehicleFactory.Bus=function(){ this.type='bus'; } VehicleFactory.Bus.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 BMWObject = new BMW(100,100); console.log(BMWObject.getPrice()); console.log(BMWObject.getColor());