學習JavaScript設計模式——工廠模式(二)

工廠方法模式——給我一張名片

工廠方法模式:

  • 通過對產(chǎn)品類抽象使其創(chuàng)建業(yè)務觉既,主要負責用于創(chuàng)建多類產(chǎn)品的實例郎哭。
  • 本意是說將實際創(chuàng)建對象工作推遲到子類當中.(在子類當中寫具體邏輯代碼蓖康,Java abstract 抽象類)
  • Java?Script中將工廠方法看做一個實例化對象的工廠類
  • 最好使用安全模式類,即給個類型的判斷(this instanceof 類)

安全模式

  var Demo = function(){
    if(!this instanceof Demo){
      return new Demo()
    }
  }
  
  Demo.prototype = {
    show: function(){
      console.log('獲取成功')
    }
  }
  
  var d = Demo()
  
  d.show()
  

安全的工廠方法

  // 安全模式創(chuàng)建的工廠類
  var Factory = fucntion(type, content) {
     if(this instanceof Factory) {
        var s = new this[type](content)
        return s
     } else {
        return new Factory(type, content)
     }
  }
  
  // 工廠原型中設置 創(chuàng)建所有類型數(shù)據(jù)對象 的基類
  Factory.prototype = {
   Java: function(content) {
     // ......
   },
   JavaScript: function(content) {
    // ......
   },
   UI: function(content) {
     this.content = content;
     (function(content){
        var div = document.createElement('div');
        div.innerHTML = content
        div.style.border = '1px solid red'
        document.getElementById('container').applendChild(div)
     })(content)
   },
   php: function(content) {
     // ......
   }
  }

工廠方法模式的好處

  1. 如果想添加其他類,不需要修改工廠類碴犬,而只需要在工廠類的原型里進行添加所需要的基類即可
  2. 好比你在Facroty類的原型里面注冊了一張名片,以后需要哪類直接拿著這張名片梆暮,查找這上面的信息就能找到這個類了(可以根據(jù)參數(shù)查找工廠的所需要的類)服协,不用擔心使用時找不到基類
  3. 可以輕松創(chuàng)建多個類的實例對象,避免使用者與對象類之間的耦合啦粹,用戶不必關心創(chuàng)建該對象的具體類偿荷,只需要調用工廠方法即可

抽象工廠模式——出現(xiàn)的都是幻覺

  • 通過對類的工廠抽象使其業(yè)務用于對產(chǎn)品類簇的創(chuàng)建,而不負責創(chuàng)建某一類產(chǎn)品的實例
  • 一般用抽象工廠模式作為父類來創(chuàng)建一些子類

示例代碼

 var VehicleFactory = function(subType, superType){
   if(typeof VehicleFactory[superType] === 'function'){
      // 緩存類
      function F(){}
      // 繼承父類的屬性和方法
      F.prototype = new VehicleFactory[superType]()
      // 將子類的constructor指向子類
      subType.constuctor = subType
      // 子類原型繼承"父類"(父類的一個實例)
      subType.prototype = new F()
   } else {
      // 拋出未創(chuàng)建抽象類的錯誤
      throw new Error('為創(chuàng)建該抽象類')
   }
 }
 
 // 小汽車抽象類
 VehicleFactory.Car = function(){
   this.type = 'car' 
 }
 
 VehicleFactory.Car.prototype = {
   getPrice: function(){
     return new Error('抽象方法不能調用')
   },
   getSpeed: function(){
     return new Error('抽象方法不能調用')
   }
 }
 
 // 公共汽車抽象類
 VehicleFactory.Bus = function(){
   this.type = 'bus'
 }
 
 VehicleFactory.Bus.prototype = {
   getPrice: function(){
     return new Error('抽象方法不能調用唠椭,只能重寫')
   },
   getPassengerNum: function(){
     return new Error('抽象方法不能調用跳纳,只能重寫')
   }
 }
 
 // 卡車抽象類
 VehicleFactory.Truck = function(){
   this.type = 'truck'
 }
 
 VehicleFactory.Truck.prototype = {
   getPrice: function(){
     return new Error('抽象方法不能調用,只能重寫')
   },
   getTrainload: function(){
     return new Error('抽象方法不能調用贪嫂,只能重寫')
   }
 }
  

從上面代碼可以看出

  • 抽象工廠其實是一個實現(xiàn)子類繼承父類的方法
  • 在這個方法中我們需要通過傳遞子類以及要繼承父類(抽象類)的名稱
  • 并且在抽象工廠方法中又增加了一次對抽象類存在性的一次判斷寺庄,如果存在,則將子類繼承父類的方法
  • 然后子類通過寄生式繼承力崇,不過不是繼承父類的原型斗塘,而是通過new關鍵字復制父類的一個實例(這么做的原因是因為過渡類不應僅僅繼承父類的原型方法,還要繼承父類的對象屬性餐曹,所以要通過new關鍵字將父類的構造函數(shù)執(zhí)行一遍來復制構造函數(shù)中的屬性和方法)
  • 對抽象工廠添加抽象類也很特殊逛拱,因為抽象工廠是個方法不需要實例化對象,所以只需要一份台猴,因此直接為抽象工廠添加類的屬性即可

使用方法

 // 寶馬汽車類
 let BMW = function(price, speed){
   this.price = price;
   this.speed = speed;
 }
 
 // 使用抽象工廠方法繼承抽象類‘Car’
 VehicleFactory(BMW,'Car')
 // 重寫抽象類的方法
 BMW.prototype.getPrice = function(){
    return this.price
 }
 
 BMW.prototype.getSpeed = function(){
    return this.speed
 }
 
 // 宇通汽車類
 let YUTONG = function(price, passenger) {
   this.price = price;
   this.speed = passenger;
 }
 // 抽象工廠實現(xiàn)對Bus抽象類的繼承
 VehicleFactory(YUTONG, 'Bus')
 // 重寫抽象類的方法
 YUTONG.prototype.getPrice = function(){
   return this.price
 }
 
 YUTONG.prototype.getPassengerNum = function(){
   return this.passenger
 }
 
 // 奔馳卡車類
 let BenzTruck = function(price, trainload){
   this.price = price;
   this.trainload = trainload;
 }
 
 // 抽象工廠實現(xiàn)對Truck抽象類的繼承
 VehicleFactory(BenzTruck, 'Truck')
 // 重寫抽象類的方法
 BenzTruck.prototype.getSpeed = function(){
   return this.speed
 }
 
 BenzTruck.prototype.getTrainload = function(){
   return this.trainload
 }
 
 // 實例化
 let car = new BMW(200000, 100)
 console.log(car.getPrice())    // 200000
 console.log(car.type)          // car

自己這些代碼的過程中

  • 抽象工廠方法的意義在于朽合,實現(xiàn)子類對父類(抽象類)的繼承,從而繼承抽象類的屬性和方法饱狂,對抽象類的方法進行重寫曹步,達到復用的目的
  • 可以對多個抽象類進行封裝,能夠方便管理
  • 和Java的抽象類達到比較相似的程度

由于更熟悉這個抽象工廠模式休讳,從而自己寫了幾次讲婚,所以更新的比較慢,見諒俊柔,主要是想要徹底熟悉了解這個抽象工廠方法

收獲:

  • 抽象工廠模式是設計模式中最抽象的一種筹麸,也是創(chuàng)建模式中唯一一種抽象化創(chuàng)建模式活合。
  • 該模式創(chuàng)建出的結果不是一個真實的對象實例,而是一個類簇(管理多個抽象類)物赶,它制定了類的結構
  • 區(qū)別于 簡單工廠模式 創(chuàng)建單一對象白指, 工廠方式模式創(chuàng)建多累對象
  • 由于JavaScript中不支持抽象化創(chuàng)建與虛擬方法,所以導致這種模式不能像其他面向對象語言中應用得那么廣泛

工廠模式主要是為了創(chuàng)建對象實例或者類簇(抽象工廠),關心的是最終產(chǎn)出(創(chuàng)建)的是什么酵紫。不關心創(chuàng)建的整個過程告嘲,僅僅需要知道最終創(chuàng)建的結果。得到的都是對象實例或者類簇奖地。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末橄唬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子参歹,更是在濱河造成了極大的恐慌仰楚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犬庇,死亡現(xiàn)場離奇詭異缸血,居然都是意外死亡,警方通過查閱死者的電腦和手機械筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飒炎,“玉大人埋哟,你說我怎么就攤上這事±赏簦” “怎么了赤赊?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煞赢。 經(jīng)常有香客問我抛计,道長,這世上最難降的妖魔是什么照筑? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任吹截,我火速辦了婚禮,結果婚禮上凝危,老公的妹妹穿的比我還像新娘波俄。我一直安慰自己,他們只是感情好蛾默,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布懦铺。 她就那樣靜靜地躺著,像睡著了一般支鸡。 火紅的嫁衣襯著肌膚如雪冬念。 梳的紋絲不亂的頭發(fā)上趁窃,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音急前,去河邊找鬼醒陆。 笑死,一個胖子當著我的面吹牛叔汁,可吹牛的內容都是我干的统求。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼据块,長吁一口氣:“原來是場噩夢啊……” “哼码邻!你這毒婦竟也來了?” 一聲冷哼從身側響起另假,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤像屋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后边篮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體己莺,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年戈轿,在試婚紗的時候發(fā)現(xiàn)自己被綠了凌受。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡思杯,死狀恐怖胜蛉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情色乾,我是刑警寧澤誊册,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站暖璧,受9級特大地震影響案怯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜澎办,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一嘲碱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧局蚀,春花似錦悍汛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春宵蛀,著一層夾襖步出監(jiān)牢的瞬間昆著,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工术陶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凑懂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓梧宫,卻偏偏與公主長得像接谨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塘匣,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容