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