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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

三言?xún)烧Z(yǔ)說(shuō)透設(shè)計(jì)模式的藝術(shù)-工廠(chǎng)方法模式

來(lái)源: 責(zé)編: 時(shí)間:2023-08-09 23:04:07 340觀(guān)看
導(dǎo)讀1寫(xiě)在前面前面寫(xiě)到簡(jiǎn)單工廠(chǎng)模式雖然比較簡(jiǎn)單,將實(shí)例的創(chuàng)建和使用分類(lèi),客戶(hù)端只需使用由工廠(chǎng)類(lèi)創(chuàng)建的對(duì)象即可,無(wú)需關(guān)心對(duì)象的創(chuàng)建過(guò)程。但是這個(gè)系統(tǒng)仍然存在問(wèn)題:1)工廠(chǎng)類(lèi)過(guò)于龐大,包含了大量的if判斷語(yǔ)句代碼,導(dǎo)致維護(hù)和測(cè)

1寫(xiě)在前面

前面寫(xiě)到簡(jiǎn)單工廠(chǎng)模式雖然比較簡(jiǎn)單,將實(shí)例的創(chuàng)建和使用分類(lèi),客戶(hù)端只需使用由工廠(chǎng)類(lèi)創(chuàng)建的對(duì)象即可,無(wú)需關(guān)心對(duì)象的創(chuàng)建過(guò)程。但是這個(gè)系統(tǒng)仍然存在問(wèn)題:vR428資訊網(wǎng)——每日最新資訊28at.com

1)工廠(chǎng)類(lèi)過(guò)于龐大,包含了大量的if判斷語(yǔ)句代碼,導(dǎo)致維護(hù)和測(cè)試難度增加;vR428資訊網(wǎng)——每日最新資訊28at.com

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

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

2工廠(chǎng)方法模式

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

工廠(chǎng)方法模式,是對(duì)簡(jiǎn)單工廠(chǎng)模式進(jìn)行重構(gòu),即定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)。工廠(chǎng)方法使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。vR428資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

我們使用 Typescript 代碼來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的工廠(chǎng)方法模式:vR428資訊網(wǎng)——每日最新資訊28at.com

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

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

然后是抽象工廠(chǎng)類(lèi)和具體工廠(chǎng)類(lèi):vR428資訊網(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();  }}

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

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

客戶(hù)端通過(guò)具體工廠(chǎng)來(lái)獲取需要的產(chǎn)品,不關(guān)心實(shí)際產(chǎn)品類(lèi)名。vR428資訊網(wǎng)——每日最新資訊28at.com

在抽象工廠(chǎng)中使用泛型

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

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

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

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

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

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

這種方式更簡(jiǎn)單,降低了代碼的復(fù)雜度,但缺少面向?qū)ο蟮撵`活性。vR428資訊網(wǎng)——每日最新資訊28at.com

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

簡(jiǎn)單工廠(chǎng)模式中工廠(chǎng)類(lèi)負(fù)責(zé)所有產(chǎn)品的創(chuàng)建;而工廠(chǎng)方法模式中每一個(gè)具體工廠(chǎng)類(lèi)只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的一個(gè)產(chǎn)品,它將產(chǎn)品的創(chuàng)建推遲到子類(lèi)。vR428資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

我們可以使用工廠(chǎng)方法模式實(shí)現(xiàn)一個(gè)游戲工廠(chǎng),用于生成不同類(lèi)型的游戲?qū)ο蟆?span style="display:none">vR428資訊網(wǎng)——每日最新資訊28at.com

首先是游戲基類(lèi)和具體游戲類(lèi):vR428資訊網(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');  }}

然后是抽象工廠(chǎng)和具體工廠(chǎng):vR428資訊網(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();   }}

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

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

客戶(hù)端只需要關(guān)心游戲類(lèi)型,而不關(guān)心具體類(lèi)名。vR428資訊網(wǎng)——每日最新資訊28at.com

4總結(jié)

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

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

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

本文鏈接:http://www.www897cc.com/showinfo-26-5206-0.html三言?xún)烧Z(yǔ)說(shuō)透設(shè)計(jì)模式的藝術(shù)-工廠(chǎng)方法模式

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

上一篇: 分享幾款好用且免費(fèi)的項(xiàng)目管理工具

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

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 民权县| 澎湖县| 建宁县| 枣庄市| 柳州市| 巴中市| 临海市| 沅陵县| 南丹县| 乐陵市| 高雄市| 鲁山县| 黄大仙区| 商南县| 兰溪市| 荣昌县| 呼和浩特市| 宝丰县| 上蔡县| 尼木县| 湘阴县| 仁寿县| 永宁县| 安徽省| 满洲里市| 祁门县| 西丰县| 潜山县| 仙居县| 全椒县| 大连市| 莎车县| 吉木乃县| 台南县| 庆城县| 舞阳县| 图片| 镇远县| 霍山县| 罗江县| 绥芬河市|