【Javascript设计模式】第四课 幽灵工厂——抽象工厂模式

在JavaScript中abstract是一个保留字,所谓的抽象类是一种声明可是不能使用的类,当你使用时就会报错,这时咱们能够手动将错误抛出;
  
  
  
  
var Car = function(){};Car.prototype = { getPrice : function () { throw new Error("抽象方法不能调用"); }, getSpeed : function () { throw new Error("抽象方法不能调用"); }};
若是调用的话,使用debug调试得出
   
   
   
   
var car = new Car();car.getPrice();//Car is not defined

咱们建立的这个Car类,其实什么都不能作,类中没有定义属性,原型的方法也不能使用。可是在继承上颇有用,由于定义了一个类,而且定义了该类所具有的方法,若是在子类中继承父类,没有重写这些方法,那么当调用时没有找到这些方法就会报错。

对于抽象类有一个对应的模式——抽象工厂模式
   
   
   
   
/******************************************* * 抽象工厂模式 ******************************************/var VehicleFactory = function (subType, superType) { //判断抽象工厂中是否有该抽象类 if(typeof VehicleFactory[superType] === 'function'){ //定义一个缓存类 function F(){}; //继承父类的属性和方法 F.prototype = new VehicleFactory[superType](); //将子类constructor指向子类 subType.constructor = subType; //子类原型继承父类 subType.prototype = new F(); }else{ throw new Error('未建立该抽象类'); }}
    
    
    
    
//定义一个小汽车类VehicleFactory.Car= function () { this.type = 'car';}VehicleFactory.Car.prototype = { getPrice : function(){ throw new Error('未建立该抽象类'); }, getSpeed : function () { throw new Error('未建立该抽象类'); }}//定义一个公交车类VehicleFactory.Bus= function () { this.type = 'bus';}VehicleFactory.Bus.prototype = { getPrice : function () { throw new Error('未建立该抽象类'); }, getSpeed : function () { throw new Error('未建立该抽象类'); }}
从上面能够看到抽象工厂其实就是一个实现子类继承父类的方法,在这个方法中咱们须要经过传递子类以及要继承父类(抽象类)的名称,而且在抽象工厂方法中添加了一次对抽象类存在性的判断,若是存在,则将子类继承父类的方法,而后子类经过寄生式继承。
测试以下:
   
   
   
   
var BMW = function (price, speed) { this.price = price; this.speed = speed; } VehicleFactory(BMW,'Car'); BMW.prototype.getPrice = function () { return this.price; } BMW.prototype.getSpeed = function () { return this.speed; } var bmw = new BMW(1000,100); console.info(bmw.getSpeed()); console.info(bmw.getPrice());
抽象工厂模式、工厂方法模式以及简单工厂模式的异同点及其关系
    简单工厂,工厂方法以及抽象工厂都属于设计模式中的建立型模式,其主要功能都是帮助咱们把对象实例化部分抽取出来,优化了系统的架构,加强了系统的扩展性。

三者的共同点是:前端

1、都有两种做用不一样的类:产品类和工厂类。其中,工厂类在本身的方法中实例化产品类(即便用new命令生成产品类的对象),并将生成的产品类的对象提供给外部使用。设计模式

2、建立的过程,都是相似的:工厂类获得一个标志(能够由程序输入,也能够读取配置文件中的内容),返回一个产品对象。 缓存

三者的不一样点架构

1、简单工厂测试

简单工厂方法中,包括一个“抽象产品类(该类能够是接口Interface,也能够是实际的类Class),全部须要的产品类都是该抽象产品类的子类(若是是接口的话,那么就是说全部产品类都继承了该接口)。优化

简单工厂通常只包含一个具体的工厂类,由该工厂类生成全部的产品类的对象。生成产品类的方法,其内部通常是相似于switch的结构,根据输入的标志,选择建立不一样类型的对象。因为不知道建立的对象究竟是哪一个类的,因此方法的返回值的类型是抽象产品类this

 

2、工厂方法spa

抽象工厂中,包括“抽象工厂类抽象产品类,同时包含不仅一个工厂类。全部的工厂类都必须是抽象工厂类的子类,全部的产品都必须是抽象产品类的子类。prototype

和简单工厂比起来,工厂方法通常是从抽象工厂开始的。通常都是在抽象工厂类中提供一个静态方法,由该方法根据输入的标志,生成不一样的具体工厂类,而后由具体的产品类生成具体的产品。注意,一个具体工厂类只能生成一种具体的产品类的对象,不一样的具体工厂生成不一样的产品,而不是像简单工厂中那样,一个工厂类能够生成多种不一样产品类的对象。能够这么理解,在选择不一样的具体工厂类的时候,就选择了生成的产品,相对于简单工厂,至关于将选择产品的动做提早了。debug

由于不知道建立的具体工厂类究竟是哪个,因此生成具体工厂类的静态方法的返回值的类型是“抽象工厂类。具体工厂类生成产品类的方法,返回值的类型也要求是抽象产品类(由于前端调用的时候,须要使用一样的代码来访问)。 

3、抽象工厂

抽象工厂和工厂方法很相似,区别以下: 

工厂方法模式:
一个抽象产品类,能够派生出多个具体产品类。   
一个抽象工厂类,能够派生出多个具体工厂类。   
每一个具体工厂类只能建立一个具体产品类的实例。 

抽象工厂模式:
多个抽象产品类,每一个抽象产品类能够派生出多个具体产品类。   
一个抽象工厂类,能够派生出多个具体工厂类。   
每一个具体工厂类能够建立多个具体产品类的实例。       
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能建立一个具体产品类的实例,而抽象工厂模式能够建立多个





相关文章
相关标签/搜索