国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

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

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

來源: 責編: 時間:2023-08-05 11:44:26 5115觀看
導讀一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計模式,它屬于類創建型模式,是其它工廠模式的入

一、寫在前面

工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計模式,它屬于類創建型模式,是其它工廠模式的入門。3oX28資訊網——每日最新資訊28at.com

二、游戲工廠的設計

ONEGAME游戲公司計劃開發一條游戲生產線,該生產線可以向玩家提供不同類型的游戲,例如:RGP游戲、MMORGP游戲、MOBA游戲以及FPS游戲等。為了提供這些游戲,游戲公司需要創建一個游戲工廠,來創建這些游戲的實例。3oX28資訊網——每日最新資訊28at.com

ONEGAME游戲公司提出了初始設計方案,就是將所有類型的游戲的實現代碼封裝到一個Game類中,然后通過Game工廠來創建實例。實現代碼如下:3oX28資訊網——每日最新資訊28at.com

class Game{  private type: string;//游戲類別  constructor(type: string, data: any) {    this.type = type;    if(type.toLocaleLowerCase() === 'fps'){      // 初始化FPS游戲    }else if(type.toLocaleLowerCase() === 'rpg'){      // 初始化RPG游戲    }else if(type.toLocaleLowerCase() === 'moba'){      // 初始化MOBA游戲    }  }  play(){    if(this.type.toLocaleLowerCase() === 'fps'){      // 玩FPS游戲    }else if(this.type.toLocaleLowerCase() === 'rpg'){      // 玩RPG游戲    }else if(this.type.toLocaleLowerCase() === 'moba'){      // 玩MOBA游戲    }  }}

上面的代碼實現了游戲的創建和玩游戲的功能,但是這樣的設計存在以下問題:3oX28資訊網——每日最新資訊28at.com

  • Game類的代碼會越來越臃腫,而且違反了單一職責原則,不利于代碼的維護和擴展。
  • 在需要對Game類進行擴展新游戲的時候,需要對源碼進行修改,這就違反了開閉原則。
  • 用戶只能通過new關鍵字來直接創建實例,而不是通過Game工廠來創建實例,耦合性高,對象創建和使用無法分離。

為了解決上面的問題,我們可以對Game類進行重構,將其拆分成多個游戲類,每個游戲類只負責自己的初始化和玩游戲的功能,這樣就可以避免代碼臃腫和違反單一職責原則的問題。但是這樣做還是無法解決對象創建和使用無法分離的問題,我們可以通過簡單工廠模式來解決這個問題。3oX28資訊網——每日最新資訊28at.com

三、簡單工廠模式

簡單工廠的設計思想就是,將創建不同對象的相關的代碼封裝到不同的類中,即具體產品類,這樣就可以避免代碼的臃腫和違反單一職責原則的問題。將它們的公共代碼抽象到和封裝到一個抽象產品類中,每個具體類都是抽象產品類的子類。然后通過一個工廠類來創建這些具體產品類的實例,通過傳入的參數不同創建對應的具體產品對象。3oX28資訊網——每日最新資訊28at.com

什么是簡單工廠模式

簡單工廠模式:定義一個工廠類,通過傳入參數來創建不同的具體產品類的實例,被創建的實例都具有共同的父類。3oX28資訊網——每日最新資訊28at.com

簡單工廠模式結構包括三個角色:3oX28資訊網——每日最新資訊28at.com

  • 工廠類:創建具體產品類的實例的工廠類,負責實現創建具體產品實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。
  • 抽象產品類:創建具體產品類的實例的抽象產品類,它是需要工廠類所創建的所有具體產品類的公共父類,封裝了各種產品對象的公有方法。
  • 具體產品類:具體產品類的實例,是簡單工廠模式的創建目標,它繼承抽象產品類的公共父類,所有被創建的對象都是這個產品對應的具體產品類的實例。

使用簡單工廠模式優化上面的代碼,以實現一個游戲工廠為為例,實現可以生產不同類型的游戲為目的。首先定義一個抽象產品類Game,然后定義具體產品類FPSGame、RPGGame、MOBAGame,最后定義一個工廠類GameFactory,通過傳入不同的參數來創建不同的游戲實例。3oX28資訊網——每日最新資訊28at.com

// 游戲接口:抽象產品類interface Game {  play(): void;}// 各種游戲的具體實現類:具體產品類// FPS游戲class FPSGame implements Game{  play() {    console.log('FPS游戲');  }}// RPG游戲class RPGGame implements Game {  play() {    console.log('RPG游戲');  }}// MOBA游戲class MOBAGame implements Game {  play() {    console.log('MOBA游戲');  }}// 游戲工廠:創建具體產品類的實例的工廠類class GameFactory {  static createGame(type: string): Game {    this.type = type;    switch (this.type) {      case 'RPG':        return new RPGGame();      case 'MOBA':        return new MOBAGame();      case 'FPS':        return new FPSGame();      default:        throw new Error('Unknown game type');    }  }}

用戶實際使用創建對應的游戲:3oX28資訊網——每日最新資訊28at.com

// 獲取RGP游戲const rgpGame = GameFactory.createGame('RPG');rgpGame.play();// 獲取MOBA游戲const mobaGame = GameFactory.createGame('MOBA');mobaGame.play();

在實際使用中,客戶端代碼只需要傳入類型參數,就可以獲取得到對應的游戲對象,而不需要關系對象的具體實現。這就符合簡單工廠模式的設計思想。3oX28資訊網——每日最新資訊28at.com

簡單工廠模式的優點

  • 封裝實例化過程:簡單工廠模式在一個工廠類中封裝了實例化對象的過程,創建對象的細節被隱藏在工廠類中,外界無需關心對象是如何被創建出來的。
  • 定義統一接口:工廠類所創建的對象都實現了一個共同的接口,對外提供一致的使用方式。
  • 通過參數創建不同實例:客戶端只需要傳入不同的參數給工廠類,就可以獲取不同的對象實例,而不需要知道具體類名。
  • 實現解耦:簡單工廠模式實現了客戶端與產品類的解耦,客戶端不需要知道所創建對象的具體實現,只需要知道參數即可。
  • 優化開閉原則:當需要新增一個產品類時,只需要實現統一接口,然后在工廠類中添加對應類型即可,無需修改客戶端代碼。
  • 高內聚,低耦合:每個產品類只關心自己的功能實現,不關心實例化過程;客戶端不依賴具體類。使代碼內聚性高、耦合度低。

四、簡單工廠模式的優化

使用泛型優化工廠類

在上面的實現中,工廠類的創建方法返回的是Game接口類型,缺點是客戶端得到的對象類型信息不全,對此可以使用泛型來改進:3oX28資訊網——每日最新資訊28at.com

// 游戲接口:抽象產品類interface Game {  play(): void;}class FPSGame implements Game {  //...}class RPGGame implements Game {  //...}class MOBAGame implements Game {  //...}class GameFactory{  static createGame<T extends Game>(type: string): T{    //...  }}

這樣在客戶端代碼得到的對象類型信息更加準確。3oX28資訊網——每日最新資訊28at.com

const rgpGame = GameFactory.createGame<RPGGame>('RPG');//  rgpGame的類型是RPGGame,而不是Game

使用泛型優化工廠類的優化

上面的代碼中,所有的產品類都需要實現 Game 接口,這樣會存在代碼重復的問題。我們可以引入一個泛型接口 IGame來改進:3oX28資訊網——每日最新資訊28at.com

interface IGame<T> {  play(): void;  info(): T; }class RPGGame implements IGame<string> {  play() {    // ...  }    info() {    return 'RPG';   }}class MOBAGame implements IGame<string> {  play() {    // ...  }    info() {    return 'MOBA';  }}class FPSGame implements IGame<string> {  // ...}

這樣每個產品類就可以定制自己的 info 方法返回值類型了。3oX28資訊網——每日最新資訊28at.com

使用抽象類改進產品類

上面的代碼還存在問題:所有產品類都需要實現 play 方法,這會導致重復代碼。我們可以使用抽象類來解決這個問題:3oX28資訊網——每日最新資訊28at.com

abstract class GameBase {  play() {    // 默認游戲邏輯  } }class RPGGame extends GameBase implements IGame<string> {  info() {    return 'RPG';  }}class MOBAGame extends GameBase implements IGame<string> {  // ...}class FPSGame extends GameBase implements IGame<string> {  // ...}

這樣產品類就不需要重復實現 play 方法了,只需要繼承 GameBase 并實現 info 方法即可。3oX28資訊網——每日最新資訊28at.com

使用配置文件創建工廠類

上面的代碼中,工廠類的創建方法需要傳入一個類型參數,這樣會導致客戶端代碼需要知道具體的類型參數,這樣就會破壞簡單工廠模式的封裝性。我們可以使用配置文件來解決這個問題:3oX28資訊網——每日最新資訊28at.com

class GameConfig {  static gameTypes = {    'RPG': RPG,    'MOBA': MOBA,    'FPS': FPS  }}

工廠類讀取配置創建對象:3oX28資訊網——每日最新資訊28at.com

class GameFactory {  static createGame(type: string) {    const Constructor = GameConfig.gameTypes[type];    if (!Constructor) {      throw new Error('Unknown type');      }    return new Constructor();  }}

這樣當需要新增游戲類型時,只需要在配置類中添加新的類型和類即可,工廠類的代碼無需修改。3oX28資訊網——每日最新資訊28at.com

利用依賴注入實現解耦

我們還可以通過依賴注入進一步解耦:3oX28資訊網——每日最新資訊28at.com

@injectable()class GameFactory {  constructor(    @inject(GameConfig.gameTypes.RPG) private rpgGame: Game,    @inject(GameConfig.gameTypes.MOBA) private mobaGame: Game,    @inject(GameConfig.gameTypes.FPS) private fpsGame: Game  ) {}  createGame(type: string) {    switch(type) {      // ...    }  }}

這樣工廠類不再負責創建對象,而是通過注入的方式獲取對象實例,大大提升了靈活性。3oX28資訊網——每日最新資訊28at.com

五、完整代碼示例

下面是使用 TypeScript 深入解析簡單工廠模式的示例,通過工廠類和產品類的抽象與解耦,可以實現創建對象邏輯的集中和優化,提高代碼的靈活性和擴展性。TypeScript 通過接口、泛型和抽象類等特性增強了簡單工廠模式的實現。掌握設計模式對編寫優雅可擴展的 TypeScript 代碼很有幫助。3oX28資訊網——每日最新資訊28at.com

// 游戲接口interface Game {  play(): void;}// 泛型游戲接口 interface IGame<T> {  play(): void;  info(): T;}// 抽象游戲類abstract class GameBase {  play() {    console.log('Playing game...');  }}// RPG游戲類class RPG extends GameBase implements IGame<string> {  info() {    return 'RPG';   }}// MMORPG游戲類  class MMORPG extends GameBase implements IGame<string> {  info() {    return 'MMORPG';  }}// FPS游戲類class FPS extends GameBase implements IGame<string> {  info() {    return 'FPS';   }}// 配置類class GameConfig {  static gameTypes = {    'RPG': RPG,    'MMORPG': MMORPG,    'FPS': FPS  }}// 工廠類class GameFactory {  static createGame(type: string) {    const Constructor = GameConfig.gameTypes[type];    if (!Constructor) {      throw new Error('Unknown type');    }    return new Constructor();  }}// 客戶端const rpgGame = GameFactory.createGame<RPG>('RPG');rpgGame.play();console.log(rpgGame.info());const fpsGame = GameFactory.createGame<FPS>('FPS');fpsGame.play();console.log(fpsGame.info());

六、簡單工廠模式和單例模式的區別

1. 用途不同

簡單工廠模式是一種創建對象的設計模式,它通過工廠類來創建產品對象,主要目的是將對象創建的過程封裝起來,便于管理和維護。3oX28資訊網——每日最新資訊28at.com

而單例模式是一種確保某個類只有一個實例的設計模式,它的目的是在整個軟件系統中,對某個類只創建一個對象實例,避免浪費資源。3oX28資訊網——每日最新資訊28at.com

2. 實現方式不同

簡單工廠模式是通過工廠類的靜態方法創建對象實例,可以創建多個實例。3oX28資訊網——每日最新資訊28at.com

單例模式是在類中定義一個靜態變量保存單例實例,并通過一個靜態方法來獲取這個實例,確保只創建一個實例。3oX28資訊網——每日最新資訊28at.com

3. 使用場景不同

簡單工廠模式用于創建同一類產品的不同對象實例,客戶端無需知道具體產品類的類名。3oX28資訊網——每日最新資訊28at.com

單例模式用于創建對唯一實例有需求的對象,如線程池、緩存、日志對象等。3oX28資訊網——每日最新資訊28at.com

小結一下,簡單工廠模式關注創建不同實例,單例模式關注如何只創建一個實例。二者解決的問題和應用場景不同,但可以結合使用,工廠類可以返回單例對象。3oX28資訊網——每日最新資訊28at.com

七、總結

通過上面的示例,我們使用 TypeScript 從多個方面對簡單工廠模式進行了深入解析,包括:3oX28資訊網——每日最新資訊28at.com

  • 使用泛型優化工廠方法的返回類型
  • 使用泛型接口減少產品類代碼重復
  • 使用抽象類提取產品類公共代碼
  • 使用配置文件動態創建產品類實例

簡單工廠模式的優點:3oX28資訊網——每日最新資訊28at.com

  • 將對象創建的過程封裝在工廠類中,實現了解耦
  • 客戶端無須知道所創建具體產品類的類名
  • 可以方便地擴展新的具體產品類

簡單工廠模式的缺點:3oX28資訊網——每日最新資訊28at.com

  • 工廠類職責較重,所有產品創建邏輯都集中在工廠類
  • 如果產品類型較多,工廠類會變得很復雜
  • 擴展新的產品困難,需要修改工廠類代碼

簡單工廠模式通過工廠類和產品類的解耦,可以實現創建對象邏輯的集中化和優化,是非常常用和靈活的一種設計模式。TypeScript 通過接口、泛型和抽象類等特性,可以更優雅地實現簡單工廠模式,提高代碼的復用性和擴展性。3oX28資訊網——每日最新資訊28at.com

本文鏈接:http://www.rrqrq.com/showinfo-26-73-0.html三言兩語說透設計模式的藝術-簡單工廠模式

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

上一篇: Raft算法:保障分布式系統共識的穩健之道

下一篇: 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
在线观看中文字幕不卡| 精品人在线二区三区| 国产日韩一区欧美| 99视频一区| av不卡在线| 亚欧美中日韩视频| 亚洲在线一区| 91国偷自产一区二区三区观看| 色偷偷成人一区二区三区91| 在线国产亚洲欧美| 91麻豆精品国产无毒不卡在线观看| 欧美老年两性高潮| 欧美大片一区二区三区| 久久精品欧美一区二区三区不卡 | 日韩女优电影在线观看| 欧美大白屁股肥臀xxxxxx| 欧美电视剧免费全集观看| 久久久电影一区二区三区| 亚洲国产精品精华液ab| 亚洲日本在线a| 美女一区二区视频| 国产成人精品免费看| 欧美女激情福利| 中文日韩欧美| 欧美日韩国产天堂| 国产午夜亚洲精品午夜鲁丝片| 中文字幕一区二区三区不卡在线| 亚洲精品国产一区二区精华液| 日本不卡视频在线| 成人h动漫精品一区二| 在线成人国产| 在线精品亚洲一区二区不卡| 精品国产乱码久久久久久久久| 国产精品国产馆在线真实露脸| 日韩vs国产vs欧美| 9l国产精品久久久久麻豆| 亚洲久久一区| 91.com在线观看| 亚洲三级在线观看| 精品午夜一区二区三区在线观看| www.亚洲精品| 亚洲精品国产一区二区精华液| 精彩视频一区二区三区| 色综合久久综合网97色综合 | √…a在线天堂一区| 欧美bbbbb| 欧美日韩福利| 欧美午夜精品久久久久久孕妇 | 香蕉影视欧美成人| 成a人片国产精品| 亚洲欧美网站| 一区二区三区在线免费观看 | 91成人在线精品| 日本一区二区视频在线观看| 午夜精品久久久久久久99樱桃| 国产精品一二二区| 国产精品久久久久久久久久直播| 欧美老年两性高潮| 亚洲国产成人porn| 欧美一区1区三区3区公司| 一本一道久久a久久精品| 国产婷婷色一区二区三区在线| 蜜臀av亚洲一区中文字幕| 欧美精品偷拍| 欧美精品 国产精品| 一区二区三区四区视频精品免费| 国产精品一区二区久激情瑜伽| 国产视频一区三区| 久久久国产一区二区三区四区小说 | 在线成人av| 久久久99精品久久| 狠狠久久亚洲欧美| 麻豆成人精品| 18成人在线观看| www.日韩大片| 日韩一区二区三区观看| 久久精品国产秦先生| 国产情侣久久| 国产精品二区一区二区aⅴ污介绍| 国产精品99久久久久久久vr| 91久久香蕉国产日韩欧美9色| 久久久99精品免费观看| 国产aⅴ综合色| 在线精品亚洲一区二区不卡| 一区二区三区国产豹纹内裤在线 | 国产色综合一区| 丁香亚洲综合激情啪啪综合| 在线观看免费成人| 亚洲成国产人片在线观看| 亚洲高清网站| 中文字幕一区二区三区蜜月| 成人av手机在线观看| 在线不卡中文字幕| 久久99国产精品久久| 色999日韩国产欧美一区二区| 亚洲一区二区三区国产| 一区二区三区欧美在线| 国产精品久久99| 欧美涩涩网站| 综合欧美一区二区三区| 亚洲成色最大综合在线| 亚洲色图视频网站| 国产午夜久久| 亚洲国产综合在线| 麻豆精品网站| 蜜臂av日日欢夜夜爽一区| 欧美无人高清视频在线观看| 精品一二三四区| 日韩欧美中文字幕公布| 99麻豆久久久国产精品免费| 久久亚洲综合av| 狠狠久久婷婷| 婷婷亚洲久悠悠色悠在线播放| 久久一区中文字幕| 精品亚洲免费视频| 精品国产伦一区二区三区观看方式| 不卡的电视剧免费网站有什么| 久久精品视频在线免费观看| 欧美91精品| 一二三四区精品视频| 91福利国产成人精品照片| 国产精品原创巨作av| 久久亚洲一级片| 日韩午夜免费视频| 偷窥少妇高潮呻吟av久久免费| 欧美日韩免费观看一区三区| 国产美女一区二区| 国产三级一区二区三区| 国产亚洲精品v| 久久不见久久见免费视频1| 日韩精品一区二区三区老鸭窝 | 国产女人水真多18毛片18精品视频 | 在线日本成人| 麻豆高清免费国产一区| 久久综合色综合88| 亚洲经典自拍| 国产综合久久久久久鬼色| 久久网这里都是精品| 中文精品视频一区二区在线观看| 麻豆精品蜜桃视频网站| 久久无码av三级| 久久九九99| 91亚洲国产成人精品一区二区三| 亚洲午夜国产一区99re久久| 欧美精品v日韩精品v韩国精品v| 国产一区久久| 寂寞少妇一区二区三区| 国产精品理伦片| 欧美优质美女网站| 欧美极品一区| 国产美女视频一区| 夜夜嗨av一区二区三区| 欧美一区二区日韩一区二区| 国产情侣久久| 91色porny蝌蚪| 日韩成人精品在线| 国产精品大尺度| 91精品国产免费| 亚洲欧美视频一区二区三区| 91一区二区在线观看| 久久综合综合久久综合| 国产精品久99| 精品欧美一区二区三区精品久久| 欧美专区一区二区三区| 色综合天天天天做夜夜夜夜做| 麻豆91在线观看| 亚洲一区二区免费视频| 日本一区二区三区在线不卡| 欧美美女喷水视频| 久久国产精品一区二区三区四区| 欧美一区二区三区四区夜夜大片 | 午夜激情一区| 国产精品18久久久久久vr| 亚洲18女电影在线观看| 中文字幕不卡三区| 精品乱人伦一区二区三区| 91久久线看在观草草青青| 一本色道久久精品| 欧美日韩国产探花| jlzzjlzz亚洲日本少妇| 国内精品久久久久影院色| 亚洲亚洲人成综合网络| 国产精品不卡在线观看| 久久精品视频免费| 久久免费的精品国产v∧| 欧美精品久久久久久久多人混战 | 欧美女孩性生活视频| 欧美一级二区| 国产日韩综合| 国产亚洲午夜| 99pao成人国产永久免费视频| 黄色在线成人| 欧美日韩在线播放一区二区| 99国产一区二区三精品乱码| 成人免费av资源| jlzzjlzz国产精品久久| 国产成人啪免费观看软件 | 亚洲一区二区三区四区中文 | 欧美精品一二三四| 欧美精品v国产精品v日韩精品|