js抽象工厂模式

        <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>


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值