日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-08-09 23:04:07 316觀看
導讀1寫在前面前面寫到簡單工廠模式雖然比較簡單,將實例的創(chuàng)建和使用分類,客戶端只需使用由工廠類創(chuàng)建的對象即可,無需關心對象的創(chuàng)建過程。但是這個系統(tǒng)仍然存在問題:1)工廠類過于龐大,包含了大量的if判斷語句代碼,導致維護和測

1寫在前面

前面寫到簡單工廠模式雖然比較簡單,將實例的創(chuàng)建和使用分類,客戶端只需使用由工廠類創(chuàng)建的對象即可,無需關心對象的創(chuàng)建過程。但是這個系統(tǒng)仍然存在問題:2MH28資訊網(wǎng)——每日最新資訊28at.com

1)工廠類過于龐大,包含了大量的if判斷語句代碼,導致維護和測試難度增加;2MH28資訊網(wǎng)——每日最新資訊28at.com

2)當前只存在一個工廠類,在需要添加新產(chǎn)品時,由于靜態(tài)工廠方法通過傳入?yún)?shù)創(chuàng)建不同的產(chǎn)品,必須修改工廠了的源碼,違背了開閉原則。2MH28資訊網(wǎng)——每日最新資訊28at.com

對此,需要對簡單工廠模式進行優(yōu)化,使其具有更好的靈活性和擴展性。這也是工廠方法模式的由來。2MH28資訊網(wǎng)——每日最新資訊28at.com

2工廠方法模式

工廠方法模式(Factory Method Pattern)是簡單工廠模式的進一步抽象和推廣。在工廠方法模式中,不再提供一個統(tǒng)一的工廠類來創(chuàng)建所有的產(chǎn)品對象,而是針對不同產(chǎn)品提供不同的工廠,使每個工廠只負責創(chuàng)建對應的產(chǎn)品。2MH28資訊網(wǎng)——每日最新資訊28at.com

工廠方法模式,是對簡單工廠模式進行重構,即定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。2MH28資訊網(wǎng)——每日最新資訊28at.com

工廠方法模式包含以下主要角色:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

工廠方法模式的主要優(yōu)點:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

可能的缺點:2MH28資訊網(wǎng)——每日最新資訊28at.com

  • 每增加一個產(chǎn)品就需要增加一個具體工廠,導致系統(tǒng)中類的個數(shù)成倍增加。
  • 復雜產(chǎn)品需要對應復雜工廠類,不易維護。

3工廠方法模式的實現(xiàn)

我們使用 Typescript 代碼來實現(xiàn)一個簡單的工廠方法模式:2MH28資訊網(wǎng)——每日最新資訊28at.com

首先定義抽象產(chǎn)品類和具體產(chǎn)品類:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

然后是抽象工廠類和具體工廠類:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

客戶端代碼:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

客戶端通過具體工廠來獲取需要的產(chǎn)品,不關心實際產(chǎn)品類名。2MH28資訊網(wǎng)——每日最新資訊28at.com

在抽象工廠中使用泛型

我們可以使用泛型來定義產(chǎn)品類型:2MH28資訊網(wǎng)——每日最新資訊28at.com

interface FoodFactory<T extends Food> {  createFood(): T; }// 實現(xiàn)時指定泛型class HamburgerFactory implements FoodFactory<Hamburger> {  // ...}

這樣可以使工廠方法返回類型更加明確。2MH28資訊網(wǎng)——每日最新資訊28at.com

將工廠抽象成函數(shù)

工廠方法也可以簡單實現(xiàn)為函數(shù):2MH28資訊網(wǎng)——每日最新資訊28at.com

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

這種方式更簡單,降低了代碼的復雜度,但缺少面向對象的靈活性。2MH28資訊網(wǎng)——每日最新資訊28at.com

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

簡單工廠模式中工廠類負責所有產(chǎn)品的創(chuàng)建;而工廠方法模式中每一個具體工廠類只負責創(chuàng)建對應的一個產(chǎn)品,它將產(chǎn)品的創(chuàng)建推遲到子類。2MH28資訊網(wǎng)——每日最新資訊28at.com

兩者區(qū)別主要在:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

簡單工廠適合產(chǎn)品種類少的情況,工廠方法適合產(chǎn)品不斷擴展的場景。2MH28資訊網(wǎng)——每日最新資訊28at.com

應用實例:游戲工廠

我們可以使用工廠方法模式實現(xiàn)一個游戲工廠,用于生成不同類型的游戲對象。2MH28資訊網(wǎng)——每日最新資訊28at.com

首先是游戲基類和具體游戲類:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

然后是抽象工廠和具體工廠:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

客戶端代碼:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

客戶端只需要關心游戲類型,而不關心具體類名。2MH28資訊網(wǎng)——每日最新資訊28at.com

4總結

工廠方法模式是一種廣泛使用的設計模式,它具有以下核心特點:2MH28資訊網(wǎng)——每日最新資訊28at.com

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

綜上,工廠方法模式通過面向對象封裝了對象創(chuàng)建過程,實現(xiàn)低耦合、高內聚的代碼,給系統(tǒng)提供了靈活的產(chǎn)品擴展方式,是非常流行與常用的設計模式。2MH28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-5206-0.html三言兩語說透設計模式的藝術-工廠方法模式

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 分享幾款好用且免費的項目管理工具

下一篇: 阿里云張勇:AI云服務需求非常旺盛

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 南城县| 安多县| 峨山| 衡东县| 邛崃市| 龙南县| 收藏| 阿拉善盟| 光山县| 武冈市| 枣强县| 图片| 从江县| 浦东新区| 扎兰屯市| 阿合奇县| 沈丘县| 建昌县| 朔州市| 峨边| 康定县| 岳阳市| 建宁县| 远安县| 鲜城| 忻州市| 阿坝县| 定西市| 竹山县| 太保市| 区。| 华宁县| 高青县| 江西省| 揭阳市| 大新县| 南木林县| 长海县| 德化县| 洪江市| 西和县|