成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

三言兩語說透設計模式的藝術-工廠方法模式

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

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<T extends Food> {
  createFood(): T; 
}

// 實現時指定泛型
class HamburgerFactory implements FoodFactory<Hamburger> {
  // ...
}

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

將工廠抽象成函數

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

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

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

責任編輯:武曉燕 來源: 宇宙一碼平川
相關推薦

2023-08-04 07:26:55

工廠類集中化設計模式

2023-08-07 06:30:15

抽象工廠模式軟件設計模式

2023-08-03 08:01:27

單例模式結構開發

2023-08-08 20:13:36

設計模式原型模式

2023-08-15 11:07:37

適配器模式TypeScript

2023-07-30 15:14:19

Koa蔥圈模型

2023-08-07 08:01:09

Vuewebpack開發

2023-08-02 08:01:14

柯里化反柯里化

2023-07-27 15:04:10

Node.js核心API

2013-11-26 16:29:22

Android設計模式

2010-10-09 09:25:35

Python工廠模式

2020-08-11 11:20:30

Typescript設計模式

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2024-02-20 12:09:32

模式工廠方法接口

2021-03-06 22:50:58

設計模式抽象

2020-08-21 07:23:50

工廠模式設計

2022-01-12 13:33:25

工廠模式設計

2023-09-11 08:30:30

Creator工廠方法

2011-11-17 16:03:05

Java工廠模式Clojure

2021-09-29 13:53:17

抽象工廠模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 999久久久久久久 | 免费一区在线观看 | 在线播放第一页 | 国产成人精品免高潮在线观看 | 久久伊人精品 | 91在线电影 | 成人av网页 | 久久麻豆精品 | 精品欧美一区二区三区久久久 | 国产成人精品久久二区二区91 | 精品亚洲一区二区 | 999精品在线观看 | 天天躁日日躁狠狠很躁 | 一区二区三区视频播放 | 亚洲福利视频网 | 亚洲视频一区二区三区 | 日韩在线视频免费观看 | 国产农村妇女精品一区 | 国产日韩一区二区 | 免费精品在线视频 | 福利片在线观看 | 欧美一级全黄 | 伊人二区| 福利电影在线 | 国产精品色 | 在线视频a | 国内精品久久久久久久 | 亚洲人精品午夜 | 国产精品国产三级国产aⅴ无密码 | chengrenzaixian| 国产乡下妇女做爰 | 在线免费观看日本视频 | 午夜精品 | 少妇午夜一级艳片欧美精品 | 免费性视频 | 91久久精品一区二区二区 | 精品久久久久久久久久久久 | 免费一区二区三区 | 九九免费视频 | 一区二区三区亚洲 | 操操日|