js抽象工厂模式

来源:互联网 发布:淘宝充值方式 编辑:程序博客网 时间:2024/05/29 14:26
        <h1>第五章:出现的都是幻觉——抽象工厂模式</h1><p>抽象工厂模式(Abstract Factory):通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。</p><p>5.1: 带头模范——抽象类</p><p>javascript中abstract还是一个保留字,所以目前还不能像传统面向对象的语言那样请以创建。抽象类是一种声明但不能使用的类,当你使用时就会报错,不过,javascript是灵活的,所以我们可以在类的方法中手动抛出错误来模拟抽象类。</p><script>//汽车抽象类,当使用其实例对象的方法会报错   var Car = function(){};   Car.prototype = {      getPrice: function(){         return new Error( "抽象方法不能直接调用" );      },      getSpeed: function(){         return new Error( "抽象方法不能直接调用" );      }   }</script><p>我们看到我们创建的这个car类其实什么都不能做,创建时没有任何属性,然而原型prototype上的方法也不能用,否则会报错。</p><p>但在继承上是很有用的,因为定义了一个类,并定义了该类所必备的方法,如果子类没有重写这些方法,那么调用时能找到这些方法便会报错。这一特点是很有必要的,因为在大型应用中,总会有一些子类继承父类,这些父类经常会定义一些必要的方法,却没有具体的实现。那么子类创建了一个对象,该对象总是具备一些必要的方法,但如果这些必要的方法从父类继承过来而没有具体去重写实现,那么实例化对象便会调用父类中的这些方法,如果父类能有一个很友好的提示,那么对于忘记重写子类这些错误遗漏的避免的很有帮助的。</p><p>这也是抽象类的一个作用,即定义一个产品簇,并声明一些必要的方法,如果子类没有去重写就会抛出异常。</p><h1>幽灵工厂——抽象工厂模式</h1><script>   var VehicleFactory = function( subType, superType ){      //判断抽象工厂中是否有该抽象类      if( typeof VehicleFactory[ superType ] ==="function" ){          //缓存类          var F = function(){};          //继承父类的属性和方法          F.prototype = new VehicleFactory[ superType ]();          //子类原型继承父类           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;    };   VehicleFactory( BMW, "Car" );   BMW.prototype.getPrice = function(){      return this.price;   }   var bmw = new BMW( 100000, 1000 );   console.log( bmw.getPrice() );</script>
                 
<h1>忆之获</h1> <p>抽象工厂模式是设计模式中最抽象的一种,也是创建模式中唯一一种抽象化创建模式。该模式创建出来的结果不是一个真实的对象实例, 而是一个类簇,他制定了类的结构,这也就区别于简单工厂模式创建单一对象,工厂方法模式创建多类对象。当然由于JavaScript中不支持抽象化创建于虚拟方法, 所以到这种模式不能像其他面向对象语言中应用的那么广泛。</p>

                                             
0 0