當(dāng)前位置:主頁(yè) > 最新文章 > 正文
    三言兩語(yǔ)說(shuō)透設(shè)計(jì)模式的藝術(shù)-工廠方法模式
    來(lái)源:清一色財(cái)經(jīng)作者:洞察網(wǎng)2023-08-06 06:36:22

    工廠方法模式通過(guò)面向?qū)ο蠓庋b了對(duì)象創(chuàng)建過(guò)程,實(shí)現(xiàn)低耦合、高內(nèi)聚的代碼,給系統(tǒng)提供了靈活的產(chǎn)品擴(kuò)展方式,是非常流行與常用的設(shè)計(jì)模式。

    1寫在前面

    前面寫到簡(jiǎn)單工廠模式雖然比較簡(jiǎn)單,將實(shí)例的創(chuàng)建和使用分類,客戶端只需使用由工廠類創(chuàng)建的對(duì)象即可,無(wú)需關(guān)心對(duì)象的創(chuàng)建過(guò)程。但是這個(gè)系統(tǒng)仍然存在問題:


    (相關(guān)資料圖)

    1)工廠類過(guò)于龐大,包含了大量的if判斷語(yǔ)句代碼,導(dǎo)致維護(hù)和測(cè)試難度增加;

    2)當(dāng)前只存在一個(gè)工廠類,在需要添加新產(chǎn)品時(shí),由于靜態(tài)工廠方法通過(guò)傳入?yún)?shù)創(chuàng)建不同的產(chǎn)品,必須修改工廠了的源碼,違背了開閉原則。

    對(duì)此,需要對(duì)簡(jiǎn)單工廠模式進(jìn)行優(yōu)化,使其具有更好的靈活性和擴(kuò)展性。這也是工廠方法模式的由來(lái)。

    2工廠方法模式

    工廠方法模式(Factory Method Pattern)是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。在工廠方法模式中,不再提供一個(gè)統(tǒng)一的工廠類來(lái)創(chuàng)建所有的產(chǎn)品對(duì)象,而是針對(duì)不同產(chǎn)品提供不同的工廠,使每個(gè)工廠只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的產(chǎn)品。

    工廠方法模式,是對(duì)簡(jiǎn)單工廠模式進(jìn)行重構(gòu),即定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。

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

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

    工廠方法模式的主要優(yōu)點(diǎn):

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

    可能的缺點(diǎn):

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

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

    我們使用 Typescript 代碼來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的工廠方法模式:

    首先定義抽象產(chǎn)品類和具體產(chǎn)品類:

    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();

    客戶端通過(guò)具體工廠來(lái)獲取需要的產(chǎn)品,不關(guān)心實(shí)際產(chǎn)品類名。

    在抽象工廠中使用泛型

    我們可以使用泛型來(lái)定義產(chǎn)品類型:

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

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

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

    工廠方法也可以簡(jiǎn)單實(shí)現(xiàn)為函數(shù):

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

    這種方式更簡(jiǎn)單,降低了代碼的復(fù)雜度,但缺少面向?qū)ο蟮撵`活性。

    工廠方法模式 vs 簡(jiǎn)單工廠模式

    簡(jiǎn)單工廠模式中工廠類負(fù)責(zé)所有產(chǎn)品的創(chuàng)建;而工廠方法模式中每一個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的一個(gè)產(chǎn)品,它將產(chǎn)品的創(chuàng)建推遲到子類。

    兩者區(qū)別主要在:

    簡(jiǎn)單工廠中,工廠類負(fù)責(zé)所有產(chǎn)品創(chuàng)建。工廠方法中,每個(gè)具體工廠只負(fù)責(zé)對(duì)應(yīng)的產(chǎn)品。工廠方法模式更加靈活,易擴(kuò)展,但創(chuàng)建對(duì)象較多。

    簡(jiǎn)單工廠適合產(chǎn)品種類少的情況,工廠方法適合產(chǎn)品不斷擴(kuò)展的場(chǎng)景。

    應(yīng)用實(shí)例:游戲工廠

    我們可以使用工廠方法模式實(shí)現(xiàn)一個(gè)游戲工廠,用于生成不同類型的游戲?qū)ο蟆?/p>

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

    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();

    客戶端只需要關(guān)心游戲類型,而不關(guān)心具體類名。

    4總結(jié)

    工廠方法模式是一種廣泛使用的設(shè)計(jì)模式,它具有以下核心特點(diǎn):

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

    綜上,工廠方法模式通過(guò)面向?qū)ο蠓庋b了對(duì)象創(chuàng)建過(guò)程,實(shí)現(xiàn)低耦合、高內(nèi)聚的代碼,給系統(tǒng)提供了靈活的產(chǎn)品擴(kuò)展方式,是非常流行與常用的設(shè)計(jì)模式。

    [責(zé)任編輯:linlin]

    標(biāo)簽:

    相關(guān)文章

    評(píng)論排行
    熱門話題
    最近更新
    亚洲理论片中文字幕电影| 亚洲首页在线观看| 亚洲国产美女精品久久| 精品国产香蕉伊思人在线在线亚洲一区二区 | 亚洲精品视频在线观看你懂的| 亚洲AV无码专区国产乱码不卡 | 亚洲片国产一区一级在线观看| 国产亚洲高清在线精品不卡| 亚洲大码熟女在线观看| 亚洲日韩AV一区二区三区中文| 亚洲国产区男人本色在线观看| 亚洲综合av一区二区三区| 亚洲人成在线播放| 亚洲国产熟亚洲女视频| 亚洲乱亚洲乱妇无码| 亚洲AV成人精品一区二区三区| 国产成人亚洲毛片| 亚洲国产香蕉人人爽成AV片久久| 亚洲AV网一区二区三区 | 亚洲国产精品无码久久久不卡| 国产成人无码综合亚洲日韩| 亚洲午夜福利在线观看| 亚洲成a人片在线观看日本| 亚洲精品中文字幕无码蜜桃| 国产亚洲AV夜间福利香蕉149 | 亚洲色精品aⅴ一区区三区| 亚洲不卡av不卡一区二区| 香蕉视频在线观看亚洲| 亚洲精品不卡视频| 97se亚洲国产综合自在线| 亚洲女子高潮不断爆白浆| 日韩在线视精品在亚洲| 亚洲日韩VA无码中文字幕 | 久久狠狠爱亚洲综合影院 | 亚洲欧美日韩综合久久久 | 亚洲视频在线观看不卡| 亚洲人成伊人成综合网久久| 亚洲熟妇av午夜无码不卡| 国产亚洲精品欧洲在线观看| 最新国产AV无码专区亚洲 | 亚洲av片在线观看|