在現實生活中,工廠是負責生產產品的,好比牛奶、麪包或禮物等,這些產品知足了咱們平常的生理需求。此外,在平常生活中,咱們也離不開大大小小的系統,這些系統是由不一樣的組件對象構成。html
而做爲一名 Web 軟件開發工程師,在軟件系統的設計與開發過程當中,咱們能夠利用設計模式來提升代碼的可重用性、可擴展性和可維護性。在衆多設計模式當中,有一種被稱爲工廠模式的設計模式,它提供了建立對象的最佳方式。typescript
工廠模式能夠分爲三類:設計模式
本文阿寶哥將介紹簡單工廠模式與工廠方法模式,而抽象工廠模式將在後續的文章中介紹,下面咱們先來介紹簡單工廠模式。併發
簡單工廠模式又叫 靜態方法模式,由於工廠類中定義了一個靜態方法用於建立對象。簡單工廠讓使用者不用知道具體的參數就能夠建立出所需的 」產品「 類,即便用者能夠直接消費產品而不須要知道產品的具體生產細節。ui
相信對於剛接觸簡單工廠模式的小夥伴來講,看到以上的描述可能會以爲有點抽象。這裏爲了讓小夥伴更好地理解簡單工廠模式,阿寶哥以用戶買車爲例,來介紹一下 BMW 工廠如何使用簡單工廠模式來生產🚗。spa
在上圖中,阿寶哥模擬了用戶購車的流程,pingan 和 qhw 分別向 BMW 工廠訂購了 BMW730 和 BMW840 型號的車型,接着工廠按照對應的模型進行生產並在生產完成後交付給用戶。接下來,阿寶哥將介紹如何使用簡單工廠來描述 BMW 工廠生產指定型號車子的過程。設計
abstract class BMW { abstract run(): void; }
class BMW730 extends BMW { run(): void { console.log("BMW730 發動咯"); } }
class BMW840 extends BMW { run(): void { console.log("BMW840 發動咯"); } }
class BMWFactory { public static produceBMW(model: "730" | "840"): BMW { if (model === "730") { return new BMW730(); } else { return new BMW840(); } } }
const bmw730 = BMWFactory.produceBMW("730"); const bmw840 = BMWFactory.produceBMW("840"); bmw730.run(); bmw840.run();
以上代碼運行後的輸出結果爲:3d
BMW730 發動咯 BMW840 發動咯
經過觀察以上的輸出結果,咱們能夠知道咱們的 BMWFactory 已經能夠正常工做了。在 BMWFactory 類中,阿寶哥定義了一個 produceBMW()
方法,該方法會根據傳入的模型參數來建立不一樣型號的車子。code
看完簡單工廠模式實戰的示例,你是否是以爲簡單工廠模式仍是挺好理解的。那麼什麼場景下使用簡單工廠模式呢?要回答這個問題咱們須要來了解一下簡單工廠的優缺點。htm
瞭解完簡單工廠的優缺點,咱們來看一下它的應用場景。
在知足如下條件下能夠考慮使用簡單工廠模式:
介紹完簡單工廠模式,接下來咱們來介紹本文的主角 」工廠方法模式「。
工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫多態工廠(Polymorphic Factory)模式,它屬於類建立型模式。
在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象, 這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。
在上圖中,阿寶哥模擬了用戶購車的流程,pingan 和 qhw 分別向 BMW 730 和 BMW 840 工廠訂購了 BMW730 和 BMW840 型號的車型,接着工廠按照對應的模型進行生產並在生產完成後交付給用戶。接下來,阿寶哥來介紹如何使用工廠方法來描述 BMW 工廠生產指定型號車子的過程。
abstract class BMW { abstract run(): void; }
class BMW730 extends BMW { run(): void { console.log("BMW730 發動咯"); } }
class BMW840 extends BMW { run(): void { console.log("BMW840 發動咯"); } }
interface BMWFactory { produceBMW(): BMW; }
class BMW730Factory implements BMWFactory { produceBMW(): BMW { return new BMW730(); } }
class BMW840Factory implements BMWFactory { produceBMW(): BMW { return new BMW840(); } }
const bmw730Factory = new BMW730Factory(); const bmw840Factory = new BMW840Factory(); const bmw730 = bmw730Factory.produceBMW(); const bmw840 = bmw840Factory.produceBMW(); bmw730.run(); bmw840.run();
經過觀察以上的輸出結果,咱們能夠知道咱們的 BMW730Factory 和 BMW840Factory 工廠已經能夠正常工做了。相比前面的簡單工廠模式,工廠方法模式經過建立不一樣的工廠來生產不一樣的產品。下面咱們來看一下工廠方法有哪些優缺點。
最後咱們來簡單介紹一下工廠方法的應用場景。