javascript-抽象工厂模式

编程爱好者联盟 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());

相关推荐

82602411 / 0评论 2016-09-23