偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Typescript 設(shè)計(jì)模式之工廠方法

開發(fā) 架構(gòu)
在現(xiàn)實(shí)生活中,工廠是負(fù)責(zé)生產(chǎn)產(chǎn)品的,比如牛奶、面包或禮物等,這些產(chǎn)品滿足了我們?nèi)粘5纳硇枨?。此外,在日常生活中,我們也離不開大大小小的系統(tǒng),這些系統(tǒng)是由不同的組件對(duì)象構(gòu)成。

 [[337233]]

本文轉(zhuǎn)載自微信公眾號(hào)「全棧修仙之路」,作者阿寶哥  。轉(zhuǎn)載本文請(qǐng)聯(lián)系全棧修仙之路公眾號(hào)。 

在現(xiàn)實(shí)生活中,工廠是負(fù)責(zé)生產(chǎn)產(chǎn)品的,比如牛奶、面包或禮物等,這些產(chǎn)品滿足了我們?nèi)粘5纳硇枨蟆4送?,在日常生活中,我們也離不開大大小小的系統(tǒng),這些系統(tǒng)是由不同的組件對(duì)象構(gòu)成。

作為一名 Web 軟件開發(fā)工程師,在軟件系統(tǒng)的設(shè)計(jì)與開發(fā)過程中,我們可以利用設(shè)計(jì)模式來提高代碼的可重用性、可擴(kuò)展性和可維護(hù)性。在眾多設(shè)計(jì)模式當(dāng)中,有一種被稱為工廠模式的設(shè)計(jì)模式,它提供了創(chuàng)建對(duì)象的最佳方式。

 

工廠模式可以分為三類:

  • 簡(jiǎn)單工廠模式(Simple Factory Pattern)
  • 工廠方法模式(Factory Method Pattern)
  • 抽象工廠模式(Abstract Factory Pattern)

本文阿寶哥將介紹簡(jiǎn)單工廠模式與工廠方法模式,而抽象工廠模式將在后續(xù)的文章中介紹,下面我們先來介紹簡(jiǎn)單工廠模式。

一、簡(jiǎn)單工廠模式

1.1 簡(jiǎn)單工廠模式簡(jiǎn)介

簡(jiǎn)單工廠模式又叫 靜態(tài)方法模式,因?yàn)楣S類中定義了一個(gè)靜態(tài)方法用于創(chuàng)建對(duì)象。簡(jiǎn)單工廠讓使用者不用知道具體的參數(shù)就可以創(chuàng)建出所需的 ”產(chǎn)品“ 類,即使用者可以直接消費(fèi)產(chǎn)品而不需要知道產(chǎn)品的具體生產(chǎn)細(xì)節(jié)。

相信對(duì)于剛接觸簡(jiǎn)單工廠模式的小伙伴來說,看到以上的描述可能會(huì)覺得有點(diǎn)抽象。這里為了讓小伙伴更好地理解簡(jiǎn)單工廠模式,阿寶哥以用戶買車為例,來介紹一下 BMW 工廠如何使用簡(jiǎn)單工廠模式來生產(chǎn)。

 

在上圖中,阿寶哥模擬了用戶購(gòu)車的流程,pingan 和 qhw 分別向 BMW 工廠訂購(gòu)了 BMW730 和 BMW840 型號(hào)的車型,接著工廠按照對(duì)應(yīng)的模型進(jìn)行生產(chǎn)并在生產(chǎn)完成后交付給用戶。接下來,阿寶哥將介紹如何使用簡(jiǎn)單工廠來描述 BMW 工廠生產(chǎn)指定型號(hào)車子的過程。

1.2 簡(jiǎn)單工廠模式實(shí)戰(zhàn)

 

定義 BMW 抽象類

  1. abstract class BMW { 
  2.   abstract run(): void; 

創(chuàng)建 BMW730 類(BMW 730 Model)

  1. class BMW730 extends BMW { 
  2.   run(): void { 
  3.     console.log("BMW730 發(fā)動(dòng)咯"); 
  4.   } 

創(chuàng)建 BMW840 類(BMW 840 Model)

  1. class BMW840 extends BMW { 
  2.   run(): void { 
  3.     console.log("BMW840 發(fā)動(dòng)咯"); 
  4.   } 

創(chuàng)建 BMWFactory 工廠類

  1. class BMWFactory { 
  2.   public static produceBMW(model: "730" | "840"): BMW { 
  3.     if (model === "730") { 
  4.       return new BMW730(); 
  5.     } else { 
  6.       return new BMW840(); 
  7.     } 
  8.   } 

生產(chǎn)并發(fā)動(dòng) BMW730 和 BMW840

  1. const bmw730 = BMWFactory.produceBMW("730"); 
  2. const bmw840 = BMWFactory.produceBMW("840"); 
  3.  
  4. bmw730.run(); 
  5. bmw840.run(); 

以上代碼運(yùn)行后的輸出結(jié)果為:

  1. BMW730 發(fā)動(dòng)咯  
  2. BMW840 發(fā)動(dòng)咯 

通過觀察以上的輸出結(jié)果,我們可以知道我們的 BMWFactory 已經(jīng)可以正常工作了。在 BMWFactory 類中,阿寶哥定義了一個(gè) produceBMW() 方法,該方法會(huì)根據(jù)傳入的模型參數(shù)來創(chuàng)建不同型號(hào)的車子。

看完簡(jiǎn)單工廠模式實(shí)戰(zhàn)的示例,你是不是覺得簡(jiǎn)單工廠模式還是挺好理解的。那么什么場(chǎng)景下使用簡(jiǎn)單工廠模式呢?要回答這個(gè)問題我們需要來了解一下簡(jiǎn)單工廠的優(yōu)缺點(diǎn)。

1.3 簡(jiǎn)單工廠模式優(yōu)缺點(diǎn)

1.3.1 優(yōu)點(diǎn)

  • 將創(chuàng)建實(shí)例與使用實(shí)例的任務(wù)分開,使用者不必關(guān)心對(duì)象是如何創(chuàng)建的,實(shí)現(xiàn)了系統(tǒng)的解耦;
  • 客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可。

1.3.2 缺點(diǎn)

  • 由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響。
  • 系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí),也有可能造成工廠邏輯過于復(fù)雜,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
  • 了解完簡(jiǎn)單工廠的優(yōu)缺點(diǎn),我們來看一下它的應(yīng)用場(chǎng)景。

1.4 簡(jiǎn)單工廠模式應(yīng)用場(chǎng)景

在滿足以下條件下可以考慮使用簡(jiǎn)單工廠模式:

  • 工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少:由于創(chuàng)建的對(duì)象比較少,不會(huì)造成工廠方法中業(yè)務(wù)邏輯過于復(fù)雜。
  • 客戶端只需知道傳入工廠類靜態(tài)方法的參數(shù),而不需要關(guān)心創(chuàng)建對(duì)象的細(xì)節(jié)。

介紹完簡(jiǎn)單工廠模式,接下來我們來介紹本文的主角 ”工廠方法模式“。

二、工廠方法模式

2.1 工廠方法簡(jiǎn)介

工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式。

在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象, 這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。

 


 

 

在上圖中,阿寶哥模擬了用戶購(gòu)車的流程,pingan 和 qhw 分別向 BMW 730 和 BMW 840 工廠訂購(gòu)了 BMW730 和 BMW840 型號(hào)的車型,接著工廠按照對(duì)應(yīng)的模型進(jìn)行生產(chǎn)并在生產(chǎn)完成后交付給用戶。接下來,阿寶哥來介紹如何使用工廠方法來描述 BMW 工廠生產(chǎn)指定型號(hào)車子的過程。

2.2 工廠方法實(shí)戰(zhàn)

 

定義 BMW 抽象類

  1. abstract class BMW { 
  2.   abstract run(): void; 

創(chuàng)建 BMW730 類(BMW 730 Model)

  1. class BMW730 extends BMW { 
  2.   run(): void { 
  3.     console.log("BMW730 發(fā)動(dòng)咯"); 
  4.   } 

創(chuàng)建 BMW840 類(BMW 840 Model)

  1. class BMW840 extends BMW { 
  2.   run(): void { 
  3.     console.log("BMW840 發(fā)動(dòng)咯"); 
  4.   } 

定義 BMWFactory 接口

  1. interface BMWFactory { 
  2.   produceBMW(): BMW; 

創(chuàng)建 BMW730Factory 類

  1. class BMW730Factory implements BMWFactory { 
  2.   produceBMW(): BMW { 
  3.     return new BMW730(); 
  4.   } 

創(chuàng)建 BMW840Factory 類

  1. class BMW840Factory implements BMWFactory { 
  2.   produceBMW(): BMW { 
  3.     return new BMW840(); 
  4.   } 

生產(chǎn)并發(fā)動(dòng) BMW730 和 BMW840

  1. const bmw730Factory = new BMW730Factory(); 
  2. const bmw840Factory = new BMW840Factory(); 
  3.  
  4. const bmw730 = bmw730Factory.produceBMW(); 
  5. const bmw840 = bmw840Factory.produceBMW(); 
  6.  
  7. bmw730.run(); 
  8. bmw840.run(); 

通過觀察以上的輸出結(jié)果,我們可以知道我們的 BMW730Factory 和 BMW840Factory 工廠已經(jīng)可以正常工作了。相比前面的簡(jiǎn)單工廠模式,工廠方法模式通過創(chuàng)建不同的工廠來生產(chǎn)不同的產(chǎn)品。下面我們來看一下工廠方法有哪些優(yōu)缺點(diǎn)。

2.3 工廠方法優(yōu)缺點(diǎn)

2.3.1 優(yōu)點(diǎn)

  • 在系統(tǒng)中加入新產(chǎn)品時(shí),無須修改抽象工廠和抽象產(chǎn)品提供的接口,只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,更加符合 “開閉原則”。而簡(jiǎn)單工廠模式需要修改工廠類的判斷邏輯。
  • 符合單一職責(zé)的原則,即每個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的產(chǎn)品。而簡(jiǎn)單工廠模式中的工廠類存在一定的邏輯判斷。
  • 基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。

2.3.2 缺點(diǎn)

  • 在添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類,而且還要提供與之對(duì)應(yīng)的具體工廠類,系統(tǒng)中類的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運(yùn)行,會(huì)給系統(tǒng)帶來一些額外的開銷。
  • 一個(gè)具體工廠只能創(chuàng)建一種具體產(chǎn)品。

最后我們來簡(jiǎn)單介紹一下工廠方法的應(yīng)用場(chǎng)景。

2.4 工廠方法應(yīng)用場(chǎng)景

  • 一個(gè)類不知道它所需要的對(duì)象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名,只需要知道所對(duì)應(yīng)的工廠即可,具體的產(chǎn)品對(duì)象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類。
  • 一個(gè)類通過其子類來指定創(chuàng)建哪個(gè)對(duì)象:在工廠方法模式中,對(duì)于抽象工廠類只需要提供一個(gè)創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要?jiǎng)?chuàng)建的對(duì)象,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則,在程序運(yùn)行時(shí),子類對(duì)象將覆蓋父類對(duì)象,從而使得系統(tǒng)更容易擴(kuò)展。

三、參考資源

簡(jiǎn)單工廠模式(SimpleFactoryPattern)

design-patterns - simple_factory

工廠方法模式(Factory Method)

責(zé)任編輯:武曉燕 來源: 全棧修仙之路
相關(guān)推薦

2009-01-15 10:55:29

JavaScript設(shè)計(jì)模式抽象工廠

2013-11-26 16:29:22

Android設(shè)計(jì)模式

2010-10-09 09:25:35

Python工廠模式

2024-02-20 12:09:32

模式工廠方法接口

2020-08-21 07:23:50

工廠模式設(shè)計(jì)

2011-11-17 16:03:05

Java工廠模式Clojure

2023-08-05 13:31:20

工廠方法模式對(duì)象

2021-03-06 22:50:58

設(shè)計(jì)模式抽象

2023-09-11 08:30:30

Creator工廠方法

2010-04-19 09:30:00

工廠模式PHP設(shè)計(jì)模式

2022-05-09 08:04:50

工廠模式設(shè)計(jì)模式

2024-09-23 08:30:48

2020-09-23 06:52:49

代碼方法模式

2011-07-28 09:50:58

設(shè)計(jì)模式

2019-08-16 10:46:46

JavaScript工廠模式抽象工廠模式

2022-01-12 13:33:25

工廠模式設(shè)計(jì)

2021-06-16 08:56:06

模版方法模式設(shè)計(jì)模式行為型設(shè)計(jì)模式

2011-07-21 14:33:02

設(shè)計(jì)模式

2021-09-29 13:53:17

抽象工廠模式

2020-10-19 09:28:00

抽象工廠模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)