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、抽象工廠
抽象工廠和工廠方法很相似,區別以下:
工廠方法模式:
一個抽象產品類,能夠派生出多個具體產品類。
一個抽象工廠類,能夠派生出多個具體工廠類。
每一個具體工廠類只能建立一個具體產品類的實例。
抽象工廠模式:
多個抽象產品類,每一個抽象產品類能夠派生出多個具體產品類。
一個抽象工廠類,能夠派生出多個具體工廠類。
每一個具體工廠類能夠建立多個具體產品類的實例。
區別:
工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
工廠方法模式的具體工廠類只能建立一個具體產品類的實例,而抽象工廠模式能夠建立多個