var Car = function(){};Car.prototype = { getPrice : function () { throw new Error("抽象方法不能调用"); }, getSpeed : function () { throw new Error("抽象方法不能调用"); }};
var car = new Car();car.getPrice();//Car is not defined
/******************************************* * 抽象工厂模式 ******************************************/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、抽象工厂
抽象工厂和工厂方法很相似,区别以下:
工厂方法模式:
一个抽象产品类,能够派生出多个具体产品类。
一个抽象工厂类,能够派生出多个具体工厂类。
每一个具体工厂类只能建立一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每一个抽象产品类能够派生出多个具体产品类。
一个抽象工厂类,能够派生出多个具体工厂类。
每一个具体工厂类能够建立多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能建立一个具体产品类的实例,而抽象工厂模式能够建立多个