當前位置:主頁 > 最新文章 > 正文
    三言兩語說透設計模式的藝術-工廠方法模式
    來源:清一色財經作者:洞察網2023-08-06 06:36:22

    工廠方法模式通過面向對象封裝了對象創建過程,實現低耦合、高內聚的代碼,給系統提供了靈活的產品擴展方式,是非常流行與常用的設計模式。

    1寫在前面

    前面寫到簡單工廠模式雖然比較簡單,將實例的創建和使用分類,客戶端只需使用由工廠類創建的對象即可,無需關心對象的創建過程。但是這個系統仍然存在問題:


    (相關資料圖)

    1)工廠類過于龐大,包含了大量的if判斷語句代碼,導致維護和測試難度增加;

    2)當前只存在一個工廠類,在需要添加新產品時,由于靜態工廠方法通過傳入參數創建不同的產品,必須修改工廠了的源碼,違背了開閉原則。

    對此,需要對簡單工廠模式進行優化,使其具有更好的靈活性和擴展性。這也是工廠方法模式的由來。

    2工廠方法模式

    工廠方法模式(Factory Method Pattern)是簡單工廠模式的進一步抽象和推廣。在工廠方法模式中,不再提供一個統一的工廠類來創建所有的產品對象,而是針對不同產品提供不同的工廠,使每個工廠只負責創建對應的產品。

    工廠方法模式,是對簡單工廠模式進行重構,即定義一個用于創建對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。

    工廠方法模式包含以下主要角色:

    抽象工廠(Abstract Factory):提供了創建產品的接口,調用者通過它訪問產品。具體工廠(ConcreteFactory):實現了抽象工廠接口,完成具體產品的創建。抽象產品(Product):定義了產品的規范,描述了產品的主要特性和功能。具體產品(ConcreteProduct):實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間往往存在依賴關系。

    工廠方法模式的主要優點:

    封裝了產品創建過程,調用者只需關心所需產品類型。實現了開閉原則,增加新產品無需修改之前工廠類代碼。調用者無需知道產品類名,實現解耦,符合依賴倒轉原則。易于擴展新產品,滿足開閉原則,增加新產品僅需新增一個具體產品類和具體工廠類,無需修改現存代碼。

    可能的缺點:

    每增加一個產品就需要增加一個具體工廠,導致系統中類的個數成倍增加。復雜產品需要對應復雜工廠類,不易維護。

    3工廠方法模式的實現

    我們使用 Typescript 代碼來實現一個簡單的工廠方法模式:

    首先定義抽象產品類和具體產品類:

    interface Food {  getType(): string;}class Hamburger implements Food {  getType() {    return "Hamburger";  }}class Hotdog implements Food {  getType() {    return "Hotdog";  }}

    然后是抽象工廠類和具體工廠類:

    abstract class FoodFactory {  abstract createFood(): Food;}class HamburgerFactory extends FoodFactory {  createFood() {    return new Hamburger();  }}class HotdogFactory extends FoodFactory {  createFood() {    return new Hotdog();  }}

    客戶端代碼:

    const hamburgerFactory = new HamburgerFactory();const hamburger = hamburgerFactory.createFood();const hotdogFactory = new HotdogFactory();const hotdog = hotdogFactory.createFood();

    客戶端通過具體工廠來獲取需要的產品,不關心實際產品類名。

    在抽象工廠中使用泛型

    我們可以使用泛型來定義產品類型:

    interface FoodFactory {  createFood(): T; }// 實現時指定泛型class HamburgerFactory implements FoodFactory {  // ...}

    這樣可以使工廠方法返回類型更加明確。

    將工廠抽象成函數

    工廠方法也可以簡單實現為函數:

    function createFood(type: "Hamburger" | "Hotdog") {  switch(type) {    case "Hamburger":       return new Hamburger();    case "Hotdog":      return new Hotdog();  }}

    這種方式更簡單,降低了代碼的復雜度,但缺少面向對象的靈活性。

    工廠方法模式 vs 簡單工廠模式

    簡單工廠模式中工廠類負責所有產品的創建;而工廠方法模式中每一個具體工廠類只負責創建對應的一個產品,它將產品的創建推遲到子類。

    兩者區別主要在:

    簡單工廠中,工廠類負責所有產品創建。工廠方法中,每個具體工廠只負責對應的產品。工廠方法模式更加靈活,易擴展,但創建對象較多。

    簡單工廠適合產品種類少的情況,工廠方法適合產品不斷擴展的場景。

    應用實例:游戲工廠

    我們可以使用工廠方法模式實現一個游戲工廠,用于生成不同類型的游戲對象。

    首先是游戲基類和具體游戲類:

    interface Game {  start();}class RPG implements Game {  start() {    console.log("Starting RPG game");  } }class MMORPG implements Game {  start() {    console.log("Starting MMORPG game");  }}

    然后是抽象工廠和具體工廠:

    abstract class GameFactory {  abstract createGame(): Game;}class RPGFactory extends GameFactory {  createGame() {    return new RPG();  }}class MMORPGFactory extends GameFactory {  createGame() {   return new MMORPG();   }}

    客戶端代碼:

    const rpgFactory = new RPGFactory();const rpgGame = rpgFactory.createGame();rpgGame.start();const mmorpgFactory = new MMORPGFactory();const mmorpgGame = mmorpgFactory.createGame();mmorpgGame.start();

    客戶端只需要關心游戲類型,而不關心具體類名。

    4總結

    工廠方法模式是一種廣泛使用的設計模式,它具有以下核心特點:

    抽象工廠類負責定義創建對象的接口,而由子類實現CreateObject方法,實現了責任分解。每個具體工廠類只負責創建對應的一個產品,一個工廠類對應一個產品類。調用者只需要關心所需產品的類型,無需知道產品類名,實現了解耦。易于擴展新產品,滿足開閉原則,當新增產品時只要增加一個具體工廠和產品類,無需修改之前代碼。典型應用場景是針對同一抽象產品類有多個具體產品類的情況,而系統需要根據環境情況動態獲得不同的具體產品對象。相比簡單工廠模式,工廠方法模式更加靈活,易擴展,但創建對象較多。

    綜上,工廠方法模式通過面向對象封裝了對象創建過程,實現低耦合、高內聚的代碼,給系統提供了靈活的產品擴展方式,是非常流行與常用的設計模式。

    [責任編輯:linlin]

    標簽:

    相關文章

    評論排行
    熱門話題
    最近更新
    亚洲电影在线播放| 亚洲狠狠婷婷综合久久久久| 亚洲AV中文无码字幕色三| 亚洲熟女乱综合一区二区| 在线观看免费亚洲| 亚洲精品av无码喷奶水糖心| 亚洲欧美国产国产一区二区三区 | 亚洲欧洲中文日韩久久AV乱码 | 在线观看亚洲AV日韩AV| 亚洲一区二区三区在线观看蜜桃| 久久夜色精品国产噜噜噜亚洲AV| 亚洲另类激情综合偷自拍| 亚洲高清在线视频| 午夜亚洲AV日韩AV无码大全| 亚洲AV日韩AV高潮无码专区| 亚洲AV日韩AV天堂一区二区三区 | 亚洲第一成年网站视频| 欧美激情综合亚洲一二区| 久久精品国产亚洲AV天海翼| 亚洲AV无码专区国产乱码不卡 | 国产亚洲综合久久| 亚洲国产精品成人一区| 亚洲av日韩片在线观看| 亚洲色欲久久久久综合网| 国产精品亚洲综合专区片高清久久久| 国产精品亚洲w码日韩中文| 国产综合精品久久亚洲| 国产亚洲美女精品久久久2020 | 精品久久亚洲中文无码| 激情综合亚洲色婷婷五月| 亚洲熟妇AV一区二区三区浪潮| 亚洲av永久无码一区二区三区| 国产精品久久久久久亚洲影视| 综合一区自拍亚洲综合图区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲一区二区三区无码中文字幕 | 亚洲av极品无码专区在线观看| 亚洲色大成网站www| 国产亚洲成在线播放va| 国产日产亚洲系列| 无码久久精品国产亚洲Av影片|