国内精品免费麻豆网站91麻豆_日本高清不卡中文字幕_欧美蜜桃臀在线观看一区_欧美亚州一区在线

當前位置:主頁 > 最新文章 > 正文
三言兩語說透設計模式的藝術-工廠方法模式
來源:清一色財經作者:洞察網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]

標簽:

相關文章

評論排行
熱門話題
最近更新
国内精品免费麻豆网站91麻豆_日本高清不卡中文字幕_欧美蜜桃臀在线观看一区_欧美亚州一区在线

    粉嫩av一区二区三区在线播放 | 亚洲愉拍自拍另类高清精品| 麻豆成人久久精品二区三区红| 99久久精品免费看国产 | 欧美一区二区在线播放| 亚洲欧洲三级电影| 激情av综合网| 中文字幕日本不卡| 欧美高清激情brazzers| 一区二区理论电影在线观看| 成人精品视频一区| 一区二区欧美在线观看| 日韩色在线观看| 亚洲成a人片在线观看中文| 不卡视频一二三| 午夜亚洲福利老司机| 国产欧美一区二区精品性| 免费欧美日韩国产三级电影| 欧美激情综合在线| 777亚洲妇女| 亚洲一级二级在线| 91色视频在线| 欧美在线观看禁18| 国产精品电影一区二区| 国产成人综合亚洲91猫咪| 亚洲一区二区三区四区五区中文 | 色天天综合久久久久综合片| 国产精品动漫网站| 福利视频网站一区二区三区| 亚洲国产日韩综合久久精品| 欧美国产精品一区二区| 国产美女精品人人做人人爽| 一区二区三区四区视频精品免费 | 亚洲欧美日韩一区二区| 26uuu色噜噜精品一区二区| 麻豆视频观看网址久久| 亚洲日本一区二区| 久久久久9999亚洲精品| 国产精品一区二区三区四区| 亚洲午夜在线视频| 中文字幕亚洲电影| 99久精品国产| 欧美精品乱码久久久久久按摩| 亚洲图片欧美综合| 国产精品天美传媒| 久久蜜桃av一区二区天堂| 国产乱码字幕精品高清av| 色综合亚洲欧洲| 亚洲黄色av一区| 日本一区二区三区四区| 欧美精品一区二区久久久| 国产在线精品一区二区不卡了 | 国产蜜臀av在线一区二区三区| 日韩一级免费一区| 激情深爱一区二区| 婷婷激情综合网| 夜夜精品视频一区二区| 欧美激情一区二区| 久久综合成人精品亚洲另类欧美 | 成人在线综合网| 欧美色国产精品| 视频在线观看一区二区三区| 亚洲精品一二三| 中文字幕一区二区三区四区不卡| 91色.com| 日韩免费在线观看| 国产宾馆实践打屁股91| 欧美图区在线视频| 免播放器亚洲一区| 亚洲国产精品一区二区www| 一区二区三区日韩欧美精品| 亚洲国产激情av| 日本一区二区三区免费乱视频| av高清不卡在线| 欧美一区二区三区播放老司机| 精品无码三级在线观看视频| 色噜噜狠狠色综合中国| 视频在线在亚洲| 香蕉av福利精品导航| 亚洲一区二区高清| 亚洲尤物在线视频观看| 亚洲一区二区四区蜜桃| 曰韩精品一区二区| 一区二区欧美视频| 亚洲精品中文在线| 亚洲一卡二卡三卡四卡| 亚洲一区二区三区四区的| 亚洲国产精品久久久男人的天堂| 亚洲免费色视频| 亚洲一区二区视频在线| 亚洲一区二区中文在线| 亚洲gay无套男同| 午夜精品福利视频网站| 日韩影视精彩在线| 日本韩国欧美三级| 久久99精品国产.久久久久久| 欧美影院一区二区三区| 韩国女主播一区| 91精品国产高清一区二区三区| 国产成都精品91一区二区三| 欧美第一区第二区| 91一区在线观看| 欧美国产精品一区| 国产精品国产馆在线真实露脸| 亚洲欧美日韩国产综合在线| 夜夜精品浪潮av一区二区三区| 五月综合激情网| 欧美午夜精品一区二区蜜桃| 国产精品系列在线观看| 欧美电视剧在线观看完整版| 久久久久久久久久看片| 国产精品国产三级国产普通话蜜臀| 国产精品麻豆一区二区| 亚洲影视在线观看| 色菇凉天天综合网| 国产一区二区三区在线看麻豆| 欧美一区二区三区啪啪| 97久久超碰国产精品| 国产精品网站在线| 亚洲美女偷拍久久| 奇米综合一区二区三区精品视频| 欧美色视频一区| 99综合影院在线| 国产精品福利一区| 亚洲一级在线观看| 精品一区二区综合| 精品国产a毛片| 国产精品美女久久久久aⅴ国产馆| 亚洲午夜免费电影| 欧美日韩精品免费观看视频| 成人福利视频在线| 中文字幕一区二区三区不卡| 亚洲国产成人tv| 国产乱子轮精品视频| 久久亚洲二区三区| 亚洲人成精品久久久久| 麻豆精品新av中文字幕| 日韩欧美中文字幕精品| 中文字幕欧美激情一区| 五月婷婷另类国产| 欧美一三区三区四区免费在线看| 久久蜜臀中文字幕| 亚洲成人手机在线| 91麻豆精品91久久久久同性| 久久久噜噜噜久久人人看 | 成人免费高清视频在线观看| 国产精品福利电影一区二区三区四区| 亚洲高清免费在线| 成人自拍视频在线观看| 亚洲欧洲成人自拍| 色综合天天狠狠| 不卡av在线网| 亚洲精品久久久蜜桃| 欧美中文字幕一区| 久久久精品免费免费| 亚洲va国产天堂va久久en| 91精品国产综合久久久蜜臀粉嫩 | 粉嫩一区二区三区性色av| 国产精品日产欧美久久久久| 一本色道亚洲精品aⅴ| 波多野结衣中文一区| 一区二区三区.www| 欧美日韩国产高清一区| 欧美激情一区二区在线| 蜜桃视频在线观看一区| 国产午夜精品一区二区三区视频 | 欧美xxxx老人做受| 亚洲欧美视频在线观看| 国产电影一区在线| 亚洲精品成人精品456| 欧美美女一区二区三区| 国产精品美女久久久久久久久 | 欧美色网一区二区| 国产精品入口麻豆九色| 国内精品嫩模私拍在线| 亚洲天堂福利av| 91精品在线麻豆| 亚洲欧美日韩国产另类专区| 国产成人精品影视| 亚洲综合丝袜美腿| 日韩视频中午一区| 亚洲国产一区二区在线播放| 9人人澡人人爽人人精品| 日韩国产欧美三级| 欧美韩日一区二区三区| 欧美三级视频在线| 亚洲欧美日韩一区二区三区在线观看| 国产91丝袜在线18| 一区二区三区资源| 久久综合一区二区| 日本高清不卡一区| 国产精品国产三级国产aⅴ原创| 国产大片一区二区| 亚洲成人av免费| 中文字幕国产精品一区二区| 欧美日韩视频第一区| 亚洲黄色片在线观看| 久久婷婷成人综合色| 国产综合久久久久久久久久久久| 亚洲精品免费播放|