Typescript 設計模式之工廠方法

在現實生活中,工廠是負責生產產品的,好比牛奶、麪包或禮物等,這些產品知足了咱們平常的生理需求。此外,在平常生活中,咱們也離不開大大小小的系統,這些系統是由不一樣的組件對象構成。html

而做爲一名 Web 軟件開發工程師,在軟件系統的設計與開發過程當中,咱們能夠利用設計模式來提升代碼的可重用性、可擴展性和可維護性。在衆多設計模式當中,有一種被稱爲工廠模式的設計模式,它提供了建立對象的最佳方式。typescript

工廠模式能夠分爲三類:設計模式

  • 簡單工廠模式(Simple Factory Pattern)
  • 工廠方法模式(Factory Method Pattern)
  • 抽象工廠模式(Abstract Factory Pattern)

本文阿寶哥將介紹簡單工廠模式與工廠方法模式,而抽象工廠模式將在後續的文章中介紹,下面咱們先來介紹簡單工廠模式。併發

1、簡單工廠模式

1.1 簡單工廠模式簡介

簡單工廠模式又叫 靜態方法模式,由於工廠類中定義了一個靜態方法用於建立對象。簡單工廠讓使用者不用知道具體的參數就能夠建立出所需的 」產品「 類,即便用者能夠直接消費產品而不須要知道產品的具體生產細節。ui

相信對於剛接觸簡單工廠模式的小夥伴來講,看到以上的描述可能會以爲有點抽象。這裏爲了讓小夥伴更好地理解簡單工廠模式,阿寶哥以用戶買車爲例,來介紹一下 BMW 工廠如何使用簡單工廠模式來生產🚗。spa

在上圖中,阿寶哥模擬了用戶購車的流程,pingan 和 qhw 分別向 BMW 工廠訂購了 BMW730 和 BMW840 型號的車型,接着工廠按照對應的模型進行生產並在生產完成後交付給用戶。接下來,阿寶哥將介紹如何使用簡單工廠來描述 BMW 工廠生產指定型號車子的過程。設計

1.2 簡單工廠模式實戰

  1. 定義 BMW 抽象類
abstract class BMW {
  abstract run(): void;
}
  1. 建立 BMW730 類(BMW 730 Model)
class BMW730 extends BMW {
  run(): void {
    console.log("BMW730 發動咯");
  }
}
  1. 建立 BMW840 類(BMW 840 Model)
class BMW840 extends BMW {
  run(): void {
    console.log("BMW840 發動咯");
  }
}
  1. 建立 BMWFactory 工廠類
class BMWFactory {
  public static produceBMW(model: "730" | "840"): BMW {
    if (model === "730") {
      return new BMW730();
    } else {
      return new BMW840();
    }
  }
}
  1. 生產並發動 BMW730 和 BMW840
const bmw730 = BMWFactory.produceBMW("730");
const bmw840 = BMWFactory.produceBMW("840");

bmw730.run();
bmw840.run();

以上代碼運行後的輸出結果爲:3d

BMW730 發動咯 
BMW840 發動咯

經過觀察以上的輸出結果,咱們能夠知道咱們的 BMWFactory 已經能夠正常工做了。在 BMWFactory 類中,阿寶哥定義了一個 produceBMW() 方法,該方法會根據傳入的模型參數來建立不一樣型號的車子。code

看完簡單工廠模式實戰的示例,你是否是以爲簡單工廠模式仍是挺好理解的。那麼什麼場景下使用簡單工廠模式呢?要回答這個問題咱們須要來了解一下簡單工廠的優缺點。htm

1.3 簡單工廠模式優缺點

1.3.1 優勢
  • 將建立實例與使用實例的任務分開,使用者沒必要關心對象是如何建立的,實現了系統的解耦;
  • 客戶端無須知道所建立的具體產品類的類名,只須要知道具體產品類所對應的參數便可。
1.3.2 缺點
  • 因爲工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,也有可能形成工廠邏輯過於複雜,不利於系統的擴展和維護。

瞭解完簡單工廠的優缺點,咱們來看一下它的應用場景。

1.4 簡單工廠模式應用場景

在知足如下條件下能夠考慮使用簡單工廠模式:

  • 工廠類負責建立的對象比較少:因爲建立的對象比較少,不會形成工廠方法中業務邏輯過於複雜。
  • 客戶端只需知道傳入工廠類靜態方法的參數,而不須要關心建立對象的細節。

介紹完簡單工廠模式,接下來咱們來介紹本文的主角 」工廠方法模式「

2、工廠方法模式

2.1 工廠方法簡介

工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫多態工廠(Polymorphic Factory)模式,它屬於類建立型模式。

在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象, 這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。

在上圖中,阿寶哥模擬了用戶購車的流程,pingan 和 qhw 分別向 BMW 730 和 BMW 840 工廠訂購了 BMW730 和 BMW840 型號的車型,接着工廠按照對應的模型進行生產並在生產完成後交付給用戶。接下來,阿寶哥來介紹如何使用工廠方法來描述 BMW 工廠生產指定型號車子的過程。

2.2 工廠方法實戰

  1. 定義 BMW 抽象類
abstract class BMW {
  abstract run(): void;
}
  1. 建立 BMW730 類(BMW 730 Model)
class BMW730 extends BMW {
  run(): void {
    console.log("BMW730 發動咯");
  }
}
  1. 建立 BMW840 類(BMW 840 Model)
class BMW840 extends BMW {
  run(): void {
    console.log("BMW840 發動咯");
  }
}
  1. 定義 BMWFactory 接口
interface BMWFactory {
  produceBMW(): BMW;
}
  1. 建立 BMW730Factory 類
class BMW730Factory implements BMWFactory {
  produceBMW(): BMW {
    return new BMW730();
  }
}
  1. 建立 BMW840Factory 類
class BMW840Factory implements BMWFactory {
  produceBMW(): BMW {
    return new BMW840();
  }
}
  1. 生產並發動 BMW730 和 BMW840
const bmw730Factory = new BMW730Factory();
const bmw840Factory = new BMW840Factory();

const bmw730 = bmw730Factory.produceBMW();
const bmw840 = bmw840Factory.produceBMW();

bmw730.run();
bmw840.run();

經過觀察以上的輸出結果,咱們能夠知道咱們的 BMW730Factory 和 BMW840Factory 工廠已經能夠正常工做了。相比前面的簡單工廠模式,工廠方法模式經過建立不一樣的工廠來生產不一樣的產品。下面咱們來看一下工廠方法有哪些優缺點。

2.3 工廠方法優缺點

2.3.1 優勢
  • 在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,只要添加一個具體工廠和具體產品就能夠了。這樣,系統的可擴展性也就變得很是好,更加符合 「開閉原則」。而簡單工廠模式須要修改工廠類的判斷邏輯。
  • 符合單一職責的原則,即每一個具體工廠類只負責建立對應的產品。而簡單工廠模式中的工廠類存在必定的邏輯判斷。
  • 基於工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它可以使工廠能夠自主肯定建立何種產品對象,而如何建立這個對象的細節則徹底封裝在具體工廠內部。工廠方法模式之因此又被稱爲多態工廠模式,是由於全部的具體工廠類都具備同一抽象父類。
2.3.2 缺點
  • 在添加新產品時,須要編寫新的具體產品類,並且還要提供與之對應的具體工廠類,系統中類的個數將成對增長,在必定程度上增長了系統的複雜度,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷。
  • 一個具體工廠只能建立一種具體產品。

最後咱們來簡單介紹一下工廠方法的應用場景。

2.4 工廠方法應用場景

  • 一個類不知道它所須要的對象的類:在工廠方法模式中,客戶端不須要知道具體產品類的類名,只須要知道所對應的工廠便可,具體的產品對象由具體工廠類建立;客戶端須要知道建立具體產品的工廠類。
  • 一個類經過其子類來指定建立哪一個對象:在工廠方法模式中,對於抽象工廠類只須要提供一個建立產品的接口,而由其子類來肯定具體要建立的對象,利用面向對象的多態性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴展。

3、參考資源

4、推薦閱讀

相關文章
相關標籤/搜索