介紹
設計模式在軟體開發人員中非常流行。設計模式是對常見軟體問題的一種明確描述的解決方案。
使用設計模式的一些好處包括:
- 設計模式已經被定義,提供了解決重複問題的行業標準方法,因此,明智地使用設計模式可以節省時間。有許多Java設計模式可用於我們的基於Java的項目。
- 使用設計模式促進代碼的可重用性,從而產生更健壯和易於維護的代碼。它有助於降低軟體產品的總擁有成本(TCO)。
- 由於設計模式已經被定義,使我們的代碼易於理解和調試。這導致更快的開發,新團隊成員也容易理解。
Java設計模式分為三個類別 – 創建型,結構型和行為型設計模式。
本文作為所有Java設計模式文章的索引。
創建型設計模式
創建型設計模式提供了在特定情況下以最佳方式實例化一個Object
的解決方案。
1. 單例模式
單例模式限制了一個Class
的實例化,並確保在Java虛擬機中只存在一個該類的實例。單例模式的實現一直是開發人員之間爭論的話題。
注意:了解更多關於單例設計模式的信息。
2. 工廠模式
工廠設計模式用於當我們有一個包含多個子類的超類,並且根據輸入,我們需要返回其中一個子類的情況下。該模式將對一個Class
的實例化責任從客戶端程序轉移到工廠類中。我們可以在工廠類上應用單例模式,或者使工廠方法成為static
方法。
注意:了解更多關於工廠設計模式的信息。
3. 抽象工廠模式
抽象工廠模式與工廠模式類似,是工廠的工廠。如果您熟悉Java中的工廠設計模式,您會注意到我們有一個單一的工廠類,根據提供的輸入和工廠類使用if-else
或switch
語句返回不同的子類來實現這一點。在抽象工廠模式中,我們去掉了if-else
塊,每個子類都有一個工廠類,然後有一個根據輸入工廠類返回子類的抽象工廠類。
注意:了解更多關於抽象工廠模式。
4. 建造者模式
建造者模式是為了解決當對象包含大量屬性時的一些問題而引入的,這些問題在工廠和抽象工廠設計模式中存在。此模式通過逐步構建對象並提供一個實際返回最終Object
的方法,解決了大量可選參數和不一致狀態的問題。
注意:了解更多關於建造者模式的資訊。
5. 原型模式
當Object
的建立成本高昂且需要大量時間和資源時,並且您已經有一個類似的Object
存在時,就會使用原型模式。因此,此模式提供了一種機制來將原始Object
複製到新的Object
,然後根據我們的需求對其進行修改。此模式使用Java的克隆來複製Object
。原型設計模式要求您複製的Object
應提供複製功能。不應由任何其他類執行此操作。但是,是否使用對象屬性的淺層複製或深層複製取決於需求,是一個設計決策。
注意:了解更多關於原型模式的資訊。
結構設計模式
結構設計模式提供了不同的方式來創建類結構(例如,使用繼承和組合來從小的對象創建大的對象)。
1. 適配器模式
適配器設計模式是結構設計模式之一,用於使兩個不相關的接口能夠一起工作。將這些不相關的接口聯繫起來的對象稱為適配器。
注意:了解更多關於適配器模式的信息。
2. 複合模式
當我們需要表示部分-整體層次結構時,就使用複合模式。當我們需要以相同的方式處理結構中的對象時,可以應用複合設計模式。
注意:了解更多關於複合模式的信息。
3. 代理模式
代理模式為另一個對象
提供了一個佔位符以控制對其的訪問。當我們希望對功能提供受控訪問時,就使用此模式。
註意:了解更多關於代理模式的信息。
4. 享元模式
當我們需要創建大量對象
的類
時,就會使用享元設計模式。由於每個對象
消耗的內存空間對於低內存設備(如移動設備或嵌入式系統)可能至關重要,因此可以應用享元設計模式來減輕內存負擔,通過共享對象
。
註意:了解更多關於享元模式的信息。
5. 外觀模式
外觀模式用於幫助客戶端應用程序輕鬆與系統交互。
註:了解更多關於外觀模式的資訊。
6. 橋接模式
當介面層次結構中同時存在介面和實現時,橋接設計模式用於將介面與實現解耦,並將實現細節隱藏在客戶端程序中。橋接設計模式的實現遵循優先使用組合而不是繼承的概念。
註:了解更多關於橋接模式的資訊。
7. 裝飾者模式
注意:了解有關裝飾者模式的更多信息。
行為設計模式
行為模式提供了對象之間更好互動的解決方案,以及如何提供鬆散耦合和靈活擴展的方法。
1. 模板方法模式
模板方法模式是一種行為設計模式,用於創建方法存根並將實現的某些步驟推遲到子類中。模板方法定義了執行算法的步驟,它可以提供一個可能對所有或某些子類都通用的默認實現。
注意:了解更多關於模板方法模式的資訊。
2. 中介者模式
中介者設計模式用於在系統中的不同對象之間提供集中的通信媒介。如果對象直接與彼此交互,系統組件就會彼此緊密耦合,這會增加維護成本並且不易於靈活擴展。中介者模式專注於為對象之間的通信提供一個中介,並實現對象之間的鬆散耦合。中介者作為對象之間的路由器,它可以擁有自己的邏輯來提供通信方式。
注意:了解更多關於中介者模式
3. 職責鏈模式
職責鏈模式用於在軟體設計中實現鬆耦合,其中來自客戶端的請求被傳遞給一系列對象來處理。然後,鏈中的對象將決定由誰處理請求,以及是否需要將請求發送到鏈中的下一個對象。
我們知道在try-catch
區塊代碼中可以有多個catch
區塊。這裡的每個catch
區塊都類似於處理特定異常的處理器。因此,當try
區塊中發生異常時,它被發送到第一個catch
區塊進行處理。如果catch
區塊無法處理它,它將請求轉發給鏈中的下一個對象(即下一個catch
區塊)。如果即使最後一個catch
區塊也無法處理它,異常將被拋出到調用程序之外。
注意:了解更多有關職責鏈模式的信息。
4. 觀察者模式
觀察者設計模式在您關心一個 Object
的狀態並希望在任何變更時得到通知時非常有用。在觀察者模式中,監視另一個 Object
狀態的 Object
被稱為 observer,而被觀察的 Object
被稱為 subject。
Java 通過 java.util.Observable
類和 java.util.Observer
接口提供了一個內建平台來實現觀察者模式。然而,它並不廣泛使用,因為實現受限,大多數時候我們不想僅為實現觀察者模式而擴展一個類,因為 Java 不提供類的多重繼承。Java Message Service (JMS) 使用觀察者模式以及中介者模式,允許應用訂閱並發佈數據給其他應用。
注意:了解更多關於 觀察者模式。
5. 策略模式
策略模式在我們對特定任務有多個算法時使用,並且客戶端在運行時決定使用的實際實現。策略模式也被稱為策略模式。我們定義多個算法,並允許客戶端應用將要使用的算法作為參數傳遞。
一個最佳的範例是 Collections.sort()
方法,它接受 Comparator 參數。根據不同的比較器介面實現,物件以不同方式排序。
注意:了解更多有關 策略模式 的資訊。
6. 命令模式
命令模式用於實現請求-響應模型中的鬆散耦合。在此模式中,請求被發送到 調用者,並且調用者將其傳遞給封裝的 命令 物件。命令物件將請求傳遞給 接收者 的適當方法執行特定的操作。
注意:了解更多有關 命令模式 的資訊。
7. 狀態模式
狀態設計模式是在Object
根據其內部狀態改變其行為時使用的。如果我們必須根據其狀態改變Object
的行為,我們可以在Object
中擁有一個狀態變量,並使用if-else
條件塊根據狀態執行不同的操作。狀態模式用於通過上下文和狀態實現提供一種系統化且鬆散耦合的方式來實現這一目的。
注意: 了解更多關於狀態模式的資訊。
8. 訪問者模式
當我們需要對一組類似類型的對象執行操作時,我們使用訪問者模式。借助訪問者模式,我們可以將操作邏輯從對象移動到另一個類中。
注意: 了解更多關於訪問者模式的資訊。
9. 解釋器模式
解釋器模式用於定義語言的語法表示並提供解釋器來處理此語法。
10. 迭代器模式
迭代器模式是行为模式之一,用于提供遍历对象组的标准方式。迭代器模式广泛应用于Java集合框架,其中迭代器接口提供了遍历Collection
的方法。该模式还用于根据需求提供不同类型的迭代器。迭代器模式隐藏了通过Collection
进行遍历的实际实现,客户端程序使用迭代器方法。
注意:了解更多关于迭代器模式的信息。
11. 备忘录模式
备忘录设计模式用于在我们想要保存对象状态以便稍后恢复时使用。该模式以一种使对象的保存状态数据在Object
之外不可访问的方式实现,从而保护保存状态数据的完整性。
模擬模式是用兩個Object
實現的-originator和caretaker。原創者是需要保存和恢復其狀態的Object
,並使用內部類來保存Object
的狀態。內部類稱為“Memento”,並且是private
,因此無法從其他對象訪問。
雜項設計模式
有許多設計模式不屬於四人幫設計模式。讓我們看看一些流行的設計模式。
1. DAO設計模式
數據訪問對象(DAO)設計模式用於將數據持久性邏輯解耦到單獨的層。當我們設計與數據庫一起工作的系統時,DAO是一個非常流行的模式。想法是將服務層與數據訪問層分開。這樣我們就可以在應用程序中實現邏輯的分離。
註:了解更多關於DAO模式的信息。
2. 依賴注入模式
依賴注入模式允許我們消除硬編碼的依賴,使我們的應用程序鬆散耦合、可擴展和可維護。我們可以在Java中實現依賴注入,將依賴解析從編譯時移動到運行時。Spring框架是建立在依賴注入原則之上的。
注意:了解更多有關依賴注入模式的信息。
3. MVC 模式
模型-視圖-控制器(MVC)模式是創建Web應用程序的最古老的架構模式之一。
結論
本文總結了Java設計模式。
您可以從我們的GitHub存儲庫查看Java設計模式示例代碼。
繼續學習,請參閱更多的Java教程。
Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial