更新時間:2021-10-18 12:21:51 來源:動力節(jié)點 瀏覽1587次
設(shè)計模式在軟件開發(fā)人員中非常流行。設(shè)計模式是對常見軟件問題的詳細描述的解決方案。

使用設(shè)計模式的一些好處是:
設(shè)計模式已經(jīng)定義并提供了行業(yè)標準方法來解決重復(fù)出現(xiàn)的問題,因此如果我們明智地使用設(shè)計模式可以節(jié)省時間。我們可以在基于 Java 的項目中使用許多 Java 設(shè)計模式。
使用設(shè)計模式可提高可重用性,從而產(chǎn)生更健壯和高度可維護的代碼。它有助于降低軟件產(chǎn)品的總擁有成本 (TCO)。
由于已經(jīng)定義了設(shè)計模式,它使我們的代碼易于理解和調(diào)試。它可以加快開發(fā)速度,并且團隊的新成員很容易理解它。
Java設(shè)計模式分為三類——創(chuàng)建型、結(jié)構(gòu)型和行為型設(shè)計模式。
創(chuàng)建型設(shè)計模式提供了針對特定情況以最佳方式實例化對象的解決方案。
1.單例模式
單例模式限制類的實例化,并確保 Java 虛擬機中只存在類的一個實例。它看起來是一個非常簡單的設(shè)計模式,但是當(dāng)涉及到實現(xiàn)時,它會帶來很多實現(xiàn)問題。單例模式的實現(xiàn)一直是開發(fā)者之間有爭議的話題。查看單例設(shè)計模式以了解實現(xiàn)單例模式的不同方法以及每種方法的優(yōu)缺點。這是討論最多的 Java 設(shè)計模式之一。
2.工廠??模式
當(dāng)我們有一個具有多個子類的超類并且基于輸入,我們需要返回一個子類時,使用工廠設(shè)計模式。這種模式將類實例化的責(zé)任從客戶端程序轉(zhuǎn)移到工廠類。我們可以在 Factory 類上應(yīng)用單例模式或?qū)⒐S方法設(shè)為靜態(tài)。
3.抽象工廠模式
抽象工廠模式類似于工廠模式,它是一個工廠的工廠。如果您熟悉 java 中的工廠設(shè)計模式,您會注意到我們有一個 Factory 類,它根據(jù)提供的輸入返回不同的子類,并且工廠類使用 if-else 或 switch 語句來實現(xiàn)這一點。
在抽象工廠模式中,我們擺脫了 if-else 塊,為每個子類創(chuàng)建了一個工廠類,然后是一個抽象工廠類,它將根據(jù)輸入的工廠類返回子類。查看抽象工廠模式以了解如何使用示例程序?qū)崿F(xiàn)此模式。
4.建造者模式
引入這種模式是為了解決當(dāng)對象包含大量屬性時工廠和抽象工廠設(shè)計模式的一些問題。構(gòu)建器模式通過提供一種逐步構(gòu)建對象的方法并提供實際返回最終對象的方法,解決了大量可選參數(shù)和不一致狀態(tài)的問題。查看Builder Pattern,了解 JDK 中使用的示例程序和類。<
5.原型模式
當(dāng)對象創(chuàng)建是一件代價高昂的事情并且需要大量時間和資源并且您已經(jīng)存在類似的對象時,使用原型模式。所以這個模式提供了一種機制,可以將原始對象復(fù)制到一個新對象,然后根據(jù)我們的需要進行修改。此模式使用 java 克隆來復(fù)制對象。
原型設(shè)計模式要求您正在復(fù)制的對象應(yīng)提供復(fù)制功能。它不應(yīng)該由任何其他類完成。然而,是使用Object 屬性的淺拷貝還是深拷貝取決于需求,這是一個設(shè)計決定。
結(jié)構(gòu)模式提供了創(chuàng)建類結(jié)構(gòu)的不同方法,例如使用繼承和組合從小對象創(chuàng)建大對象。
1. 適配器模式
適配器設(shè)計模式是結(jié)構(gòu)設(shè)計模式之一,它用于使兩個不相關(guān)的接口可以一起工作。連接這些不相關(guān)接口的對象稱為適配器。作為現(xiàn)實生活中的例子,我們可以將移動充電器視為適配器,因為移動電池需要 3 伏才能充電,但普通插座產(chǎn)生 120V(美國)或 240V(印度)。因此,移動充電器充當(dāng)移動充電插座和壁式插座之間的適配器。
2. 復(fù)合模式
復(fù)合模式是結(jié)構(gòu)設(shè)計模式之一,當(dāng)我們必須表示部分-整體層次結(jié)構(gòu)時使用。當(dāng)我們需要以一種必須以相同方式處理結(jié)構(gòu)中的對象的方式創(chuàng)建結(jié)構(gòu)時,我們可以應(yīng)用復(fù)合設(shè)計模式。
3. 代理模式
代理模式的意圖是“為另一個對象提供代理或占位符以控制對其的訪問”。定義本身非常清晰,當(dāng)我們想要提供對功能的受控訪問時使用代理模式。
假設(shè)我們有一個可以在系統(tǒng)上運行某些命令的類。現(xiàn)在,如果我們正在使用它,那很好,但是如果我們想將此程序提供給客戶端應(yīng)用程序,它可能會出現(xiàn)嚴重問題,因為客戶端程序可以發(fā)出命令來刪除一些系統(tǒng)文件或更改一些您不想要的設(shè)置. 查看帶有實現(xiàn)細節(jié)的示例程序的代理模式帖子。
4.享元模式
當(dāng)我們需要創(chuàng)建一個類的大量對象時,使用享元設(shè)計模式。由于每個對象都消耗對低內(nèi)存設(shè)備(例如移動設(shè)備或嵌入式系統(tǒng))至關(guān)重要的內(nèi)存空間,因此可以應(yīng)用享元設(shè)計模式通過共享對象來減少內(nèi)存負載。java中的字符串池實現(xiàn)是享元模式實現(xiàn)的最好例子之一。
5. 外觀圖案
Facade Pattern 用于幫助客戶端應(yīng)用程序輕松地與系統(tǒng)交互。假設(shè)我們有一個應(yīng)用程序有一組接口來使用 MySql/Oracle 數(shù)據(jù)庫并生成不同類型的報告,例如 HTML 報告、PDF 報告等。所以我們將有一組不同的接口來處理不同類型的數(shù)據(jù)庫. 現(xiàn)在,客戶端應(yīng)用程序可以使用這些接口來獲取所需的數(shù)據(jù)庫連接并生成報告。但是當(dāng)復(fù)雜度增加或接口行為名稱混亂時,客戶端應(yīng)用程序會發(fā)現(xiàn)很難管理它。所以我們可以在這里應(yīng)用 Facade 模式,并在現(xiàn)有接口之上提供一個包裝器接口來幫助客戶端應(yīng)用程序。查看Facade Pattern帖子以獲取實現(xiàn)細節(jié)和示例程序。
6. 橋接模式
當(dāng)我們在接口和實現(xiàn)中都有接口層次結(jié)構(gòu)時,橋接設(shè)計模式用于將接口與實現(xiàn)分離,并向客戶端程序隱藏實現(xiàn)細節(jié)。與適配器模式一樣,它是結(jié)構(gòu)設(shè)計模式之一。
橋接設(shè)計模式的實現(xiàn)遵循更喜歡組合而不是繼承的概念。
行為模式為對象之間更好的交互以及如何提供失去耦合和靈活性以輕松擴展提供了解決方案。
1. 模板方法模式
模板方法是一種行為設(shè)計模式,用于創(chuàng)建方法存根并將一些實現(xiàn)步驟推遲到子類。模板方法定義了執(zhí)行算法的步驟,它可以提供一個默認實現(xiàn),該實現(xiàn)可能對所有或部分子類都是通用的。
2. 中介模式
中介者設(shè)計模式用于在系統(tǒng)中的不同對象之間提供集中的通信媒介。中介器設(shè)計模式在多個對象相互交互的企業(yè)應(yīng)用程序中非常有用。如果對象之間直接交互,系統(tǒng)組件之間是緊密耦合的,這使得可維護性成本更高,并且不容易靈活擴展。中介者模式專注于為對象之間的通信提供中介者,幫助實現(xiàn)對象間的解耦。
空中交通管制員是中介模式的一個很好的例子,其中機場控制室充當(dāng)不同航班之間通信的中介。中介者充當(dāng)對象之間的路由器,它可以擁有自己的邏輯來提供一種通信方式。
3.責(zé)任鏈模式
責(zé)任鏈模式用于在軟件設(shè)計中實現(xiàn)松散耦合,其中來自客戶端的請求被傳遞到對象鏈以處理它們。然后鏈中的對象將決定誰將處理請求以及是否需要將請求發(fā)送到鏈中的下一個對象。
我們知道在一個 try-catch 塊代碼中可以有多個 catch 塊。這里的每個 catch 塊都是處理該特定異常的處理器。所以當(dāng) try 塊中發(fā)生異常時,它會被發(fā)送到第一個 catch 塊進行處理。如果 catch 塊無法處理它,它會將請求轉(zhuǎn)發(fā)到鏈中的下一個對象,即下一個 catch 塊。如果即使是最后一個 catch 塊也無法處理它,則異常會被拋出到調(diào)用程序的鏈外。
4.觀察者模式
當(dāng)您對對象的狀態(tài)感興趣并希望在發(fā)生任何更改時得到通知時,觀察者設(shè)計模式非常有用。在觀察者模式中,監(jiān)視另一個對象狀態(tài)的對象稱為Observer,正在監(jiān)視的對象稱為Subject。
Java 通過 java.util.Observable 類和 java.util.Observer 接口為實現(xiàn)觀察者模式提供了一個內(nèi)置平臺。然而,它并沒有被廣泛使用,因為它的實現(xiàn)非常簡單,而且大多數(shù)時候我們不想為了實現(xiàn)觀察者模式而最終擴展一個類,因為 java 不提供類中的多重繼承。
Java 消息服務(wù) (JMS) 使用觀察者模式和中介者模式來允許應(yīng)用程序訂閱和發(fā)布數(shù)據(jù)到其他應(yīng)用程序。
策略模式也稱為策略模式。我們定義了多個算法,并讓客戶端應(yīng)用程序傳遞要用作參數(shù)的算法。這種模式的最佳示例之一是采用Comparator參數(shù)的 Collections.sort() 方法?;?Comparator 接口的不同實現(xiàn),對象以不同的方式進行排序。
要實現(xiàn)我們的文件系統(tǒng)實用程序,首先,我們需要創(chuàng)建將實際完成所有工作的接收器類。由于我們根據(jù) Java 接口進行編碼,因此我們可以擁有 FileSystemReceiver 接口及其針對不同操作系統(tǒng)風(fēng)格(如 Windows、Unix、Solaris 等)的實現(xiàn)類。
5. 訪客模式
當(dāng)我們必須對一組相似類型的對象執(zhí)行操作時,使用訪問者模式。在訪問者模式的幫助下,我們可以將操作邏輯從對象移動到另一個類。
例如,考慮一個購物車,我們可以在其中添加不同類型的商品(元素),當(dāng)我們單擊結(jié)帳按鈕時,它會計算要支付的總金額?,F(xiàn)在我們可以在項目類中擁有計算邏輯,或者我們可以使用訪問者模式將此邏輯移到另一個類中。讓我們在訪問者模式的示例中實現(xiàn)這一點。
6. 解釋器模式
用于定義語言的語法表示并提供解釋器來處理該語法。
這種模式的最好例子是一個 java 編譯器,它將 java 源代碼解釋為 JVM 可以理解的字節(jié)碼。谷歌翻譯也是解釋器模式的一個例子,其中輸入可以是任何語言,我們可以用另一種語言解釋輸出。
7. 迭代器模式
一種行為模式中的迭代器模式,它用于提供遍歷一組對象的標準方法。迭代器模式廣泛用于Java 集合框架,其中迭代器接口提供遍歷集合的方法。
迭代器模式不僅僅是遍歷一個集合,我們還可以根據(jù)我們的需求提供不同類型的迭代器。迭代器模式隱藏了遍歷集合的實際實現(xiàn),客戶端程序只使用迭代器方法。
8. 紀念品模式
當(dāng)我們想要保存對象的狀態(tài)以便我們以后可以恢復(fù)時,可以使用備忘錄設(shè)計模式。備忘錄模式用于以這樣的方式實現(xiàn)這一點,即對象的保存狀態(tài)數(shù)據(jù)在對象外部不可訪問,這保護了保存狀態(tài)數(shù)據(jù)的完整性。
Memento 模式是用兩個對象實現(xiàn)的——Originator 和 Caretaker。發(fā)起者是需要保存和恢復(fù)狀態(tài)的對象,它使用內(nèi)部類來保存對象的狀態(tài)。內(nèi)部類稱為 Memento,它是私有的,因此不能從其他對象訪問。
有很多設(shè)計模式不屬于 GoF 設(shè)計模式。讓我們看看其中一些流行的設(shè)計模式。
1. DAO 設(shè)計模式
DAO 設(shè)計模式用于將數(shù)據(jù)持久化邏輯解耦到一個單獨的層。當(dāng)我們設(shè)計系統(tǒng)以使用數(shù)據(jù)庫時,DAO 是一種非常流行的模式。這個想法是將服務(wù)層與數(shù)據(jù)訪問層分開。這樣我們就在我們的應(yīng)用程序中實現(xiàn)了邏輯的分離。
查看DAO 模式以獲取完整的詳細信息和示例程序。
2. 依賴注入模式
依賴注入允許我們移除硬編碼的依賴,并使我們的應(yīng)用程序松散耦合、可擴展和可維護。我們可以在 java 中實現(xiàn)依賴注入,將依賴解析從編譯時轉(zhuǎn)移到運行時。Spring 框架建立在依賴注入的原則之上。
閱讀有關(guān)依賴注入模式的更多信息,以了解如何在我們的 Java 應(yīng)用程序中實現(xiàn)它。
3.MVC 模式
MVC 模式是用于創(chuàng)建 Web 應(yīng)用程序的最古老的架構(gòu)模式之一。MVC 代表模型-視圖-控制器。