【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、抽象工廠

抽象工廠和工廠方法很相似,區別以下: 

工廠方法模式:
一個抽象產品類,能夠派生出多個具體產品類。   
一個抽象工廠類,能夠派生出多個具體工廠類。   
每一個具體工廠類只能建立一個具體產品類的實例。 

抽象工廠模式:
多個抽象產品類,每一個抽象產品類能夠派生出多個具體產品類。   
一個抽象工廠類,能夠派生出多個具體工廠類。   
每一個具體工廠類能夠建立多個具體產品類的實例。       
區別:
工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。   
工廠方法模式的具體工廠類只能建立一個具體產品類的實例,而抽象工廠模式能夠建立多個





相關文章
相關標籤/搜索