Java 設計模式 -- 示例指南

設計模式在軟件開發者中很是受歡迎的。每一個設計模式都是對常見軟件問題的通用的描述解決方案。java

咱們使用設計模式的好處有:算法

  • 1.設計模式已經對於一個重複出現的問題進行了定義而且提供了工業標準的解決方案,由於若是咱們合理的使用設計模式就能夠節省不少時間。
  • 2.使用設計模式提供的複用性能夠產生更加穩健和高可控的代碼。它能夠幫助減小軟件產品的總的花費。
  • 3.由於設計模式已經被定義好了,因此它讓咱們的代碼更加容易去理解和調試。它能夠提供更加快速的開發而且使團隊中的乘以更容易的理解。

java

Java設計模式被分紅了三類-建立型、結構型和行爲型的設計模式。這種劃分就是全部我寫的設計模式的一個目錄索引。數據庫

建立型設計模式

建立型設計模式可使用規範方案中最合適的方式來實體化一個對象。windows

1.單例模式(Singleton Pattern)

單例模式約束了一個類的實例化而且確保在JVM中只會存在一個類的實例。這個看起來很是簡單的設計模式可是在實現起來的時候會帶來不少的實現問題。單例模式的實如今開發中中一般是一個有爭議性的話題。看下Singleton Design Pattern文章來了解到實現單例模式的不一樣方法還有每一個方法的優勢和缺點。設計模式

2.工廠模式(Factory Pattern)

當咱們有一個父類並且它有多個子類子,咱們須要還有依賴輸入返回一個子類,那咱們就須要使用工廠設計模式了。這個方法將一個實例化類的職責從客戶端程序拿到了工廠類中。咱們能夠在工廠類中應用單例模式或者將工廠方法設置爲static類型的。看下Factory Design Pattern的例子瞭解工廠模式的優點。函數

3.抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式和工廠模式相似,它是工廠的工廠。若是你對工廠摸是熟悉的話那麼你會注意到咱們有一個根據給定的輸入返回不一樣的子類,工廠類可使用if-else或者switch語句來達到這個目的。ui

在抽象工廠模式中,咱們不在使用if-else快並且對於每個子類都有一個工廠類,而且有一個根據輸入的工廠類返回子類的抽象工廠類。看Abstract Factory Pattern來了解如何用代碼實現這個模式。編碼

4.建造者模式(Builder Pattern)

這個模式被引入是爲了解決一個對象有不少屬性的時候用工廠和抽象工廠設計模式的一些問題。建造者模式經過提供一個一步步構建的方式來解決含有大量可選參數和不一致狀態的問題,而且提供了能夠真正返回最終對象的方法。看下文章Builder Pattern來看下實例和在JDK中使用的相關類。spa

5.原型模式(Prototype Pattern)

原型模式被用在當一個對象的建立是有大量的代價並且須要大量的時間和資源而且你有一個已經存在的類似的對象的時候。因此這個模式提供了將原始對象複製到新的對象的機制,並且你能夠根據你的須要修改它。這個模式使用了java克隆來複制對象。操作系統

原型設計模式容許你複製的對象提供能夠複製的功能。它不該該是經過其餘類來完成的。可是無論怎麼說是否使用淺拷貝或者是深拷貝一個對象的屬性取決於需求和設計。看文章來Prototype Pattern看簡單的示例。

結構型設計模式

結構型設計模式提供了建立類結構的不一樣方式,好比說,使用繼承和組合的方式從小的對象來建立打的對象。

1.適配器模式(Adapter Pattern)

適配器設計模式時一個結構型的設計模式,它用於將兩個沒有關係的接口能夠在一塊兒起做用。將這些無關的接口組合在一塊兒的對象就是一個適配器。拿生活中一個實際的場景,咱們能夠把手機充電器當成是一個適配器由於手機電池須要使用3V的電,可是通常狀況下電插板只是產生120V或者240V的電。因此手機充電器就是在手機充電板和正常充電板充當一個適配器的。看下文章Adapter Pattern來看下它是如何在Java中應用的。

2.組合模式(Composite Pattern)

組合模式是一種結構型設計模式而且被用在當咱們必需要表示一個總體和部分的層次關係時。當咱們須要一種在結構中的全部對象都須要被相同的方式被處理的方式來建立一個結構時,咱們就可使用組合設計模式。

讓咱們拿生活中的實例來講明--一個圖是由好比圓和直線、角這些對象組成的結構,並且咱們當咱們須要用顏色來填充的時候,須要把相同的對象使用相同的顏色。那麼畫是由不一樣的部分組成的並且他們都有一些類似的操做。看文章Composite Pattern來看組合模式的不一樣組件以及代碼例子。

3.代理模式(Proxy Pattern)

代理模式的目的是爲其餘對象提供一個代理或者佔位來控制訪問。這個定義是很清晰的並且代理模式在咱們想去提供對一個函數的訪問控制的時候能夠被使用。

也就是說咱們在系統中有些能夠運行命令的類。如今若是咱們要使用它,這個是OK的,可是若是咱們若是咱們把程序交給客戶端應用的話,由於客戶端可能去運行一些命令去刪除或者修改你不想讓它刪除的設置或者系統文件,那麼這樣就會產生問題。看下文章Proxy Pattern來看下具體的實現例子。

4.享元模式(Flyweight Pattern)

享元設計模式被用在當咱們須要去建立一個類的大量對象的時候。由於每個對象每個對象都會消耗內存空間,這個對於好比手機或者嵌入式系統是很是很差的。享元設計模式經過共享對象的方式來減小內存的加載。字符串池的實現就是享元設計模式的最好實現例子。看文章Flyweight Pattern來了解簡單的實現過程。

5.外觀模式(Facade Pattern)

外觀模式被用在幫助客戶端程序和系統進行更加容易的交互。假設我麼有一個接口集合的應用程序去使用MYSQL\Oracle數據庫而且生成不一樣類型的報告,好比HTML報告,PDF報告等等。因此咱們爲了處理不一樣類型的數據庫咱們須要不一樣的接口集。如今一個客戶端應用可以使用這些接口去獲取須要的數據庫鏈接而且生成報告。可是當複雜性增長或者接口行爲的名詞讓咱們疑惑的時候,客戶端程序會是難去維護的。因此咱們就可使用外觀模式而且在存在接口的頂部提供一個封裝接口來幫助客戶端程序。看文章Facade Pattern來看下詳細的實現。

6.橋接模式(Bridge Pattern)

當咱們在你接口和實現中有接口層次的時候,橋接模式就能夠用於將接口從實現中解耦而且從客戶端程序中隱藏詳細的實現。像適配器模式同樣,它是一個結構型設計模式。

橋接模式的實現聽從了多用組合而不是繼承的原則。看文章Bridge Pattern的詳細實現。

7.裝飾器模式(Decorator Pattern)

裝飾器模式用於修改在運行時對象的功能的。與此同時相同類的其餘實例將不會受到影響,因此每一個獨立的對象擁有修改後的行爲。裝飾器模式一個結構型設計模式的一種,並且使用使用抽象類或者接口的組合方式來實現的。

咱們使用繼承或者組合去擴展一個對象的行爲可是這個在編譯的時候就已經完成了,而且這個能夠應用到全部的類的實例上。咱們不能在運行的時候添加新的功能 或者移除任何已經存在的行爲--這時候咱們就須要使用裝飾器模式了。看文章Decorator Pattern來看下詳細的實現。

行爲型設計模式

行爲型設計模式爲在對象之間進行更好的交互以及如何提供不用耦合和靈活的擴展提供瞭解決方案。

1.模板方法模式(Template Method Pattern)

模板方法是一個行爲型設計模式並且它用於建立一個方法stub並且推遲了一些的實現步驟到子類中。模板方法定義了運行一個算法的步驟並且它可以提供有多是全部的或者部分子類的公共的默認實現。

假設咱們想去使用一個算法來建造一個房子。爲了建造房子須要有的步驟包括-打地基、打柱子、壘牆而且安窗戶。很重的一點就是咱們不嗯呢該改變這些順序由於咱們不在打地基以前就安窗戶。在這個實力中咱們可以建立一個可使用不一樣方法構建屋子的模板方法。看文章Template Method Pattern來看具體的實現和代碼。

2.中介者模式(Mediator Pattern)

中介者設計模式用於提供一個在系統中的不一樣對象之間中間的交流媒介。中介者設計模式在一個有不少對象須要彼此交互的企業級應用中是很是有用的。若是對象直接彼此交互,那麼系統就會牢牢的耦合在一塊兒從而使維護花費更大並且不利於靈活的進行擴展。中介者模式的目的是提供了對象之間的聯繫而且幫助對象之間的解耦。

空中交通指揮員就是一箇中介者模式使用很棒的例子,由於機場控制室充當了各個航班的聯繫的中介者。中介者在對象之間充當路由器而且它能夠有本身的邏輯來提供交流聯繫的方式。看文章Mediator Pattern來代碼的具體實現。

3.責任鏈模式(Chain of Responsibility Pattern)

責任鏈模式用於在軟件設計中有來自客戶端的請求須要傳遞給一串對象來處理的場景中解耦的。在鏈中的對象將會決定誰將處理這個狀況而且這個請求是否須要傳遞給鏈中的下一個對象。

咱們清楚咱們在一個try-cathc代碼塊中能夠有多個catch塊。這裏每個catch塊都是一種形式的處理器去處理特殊的異常。因此當在try中出現任何異常的時候,它會傳遞給第一個catch塊。若是catch塊沒辦法處理它,它會將狀況傳遞給下個對象。即便最後一個catch塊沒辦法處理它,那麼異常將會拋出到鏈的外面到調用它的程序。

ATM分發機邏輯就是使用了Chain of Responsibility Pattern的實現,看下連接。

4.觀察者模式(Observer Pattern)

觀察者模式在你對一個對象的狀態感興趣而且但願在任什麼時候候發生改變的時候都可以獲得通知的場景下是頗有用的。在觀察者模式中,觀察其餘對象的狀態的對象被稱爲Observer,而被觀察的對象被稱爲Subject

Java經過java.util.Observable類和java.util.Observer接口提供了內置的觀察者模式的實現。的可是由於這個實現很是的簡單並且大部分的時候咱們不想經過擴展一個類來實現觀察者模式由於java不提供類的多繼承,因此它被使用的不普遍。

Java消息服務(JMS)使用中介者模式中在介者模式中一塊來容許應用來訂閱和發佈數據到其餘的應用中。看文章Observer Pattern來具體的實現和示例程序。

5.策略模式(Strategy Pattern)

策略模式被用在當咱們對於一個指定的任務有多個算法的時候並且客戶端在運行時決定實際的使用實現算法。

策略模式也被熟知是Policy Pattern。咱們定義多個算法並且讓客戶端傳遞須要使用的算法做爲參數。詮釋最好的例子就是 Collections.sort() 方法的Comparator 參數。基於不一樣的比較器接口的實現,對象就會使用不一樣的方法來進行排序。

看文章Strategy Pattern來看具體的實現和實例程序。

6.命令模式(Command Pattern)

命令模式用於在請求應答模型中解耦和的。在命令模式中,一個請求被你發送給調用者(invoker)並且invoker把它傳遞給封裝好的command對象。command對象將請求傳遞給合適的接收者(receiver)來進行處理。

能夠這樣解釋,咱們想去爲一個文件系統一個可以打開、寫和關閉的方法並且它可以支持例如windows和Unix等多個操做系統。爲了系統咱們的文件系統,首先咱們須要建立最後實際工做 的receiver類。由於咱們是以java接口的形式來編碼,咱們須要有FileSystemReceiver 接口和它的針對不一樣的OS的具體實現類,例如 Windows, Unix, Solaris 等等。看文章Command Pattern的具體實現以及代碼實例。

7.狀態模式(State Pattern)

狀態模式用於當一個對象須要基於它的內部狀態來改變他的行爲的時候。

若是咱們必須必須根據他的狀態來它的行爲時,咱們能夠在對象的內部設置一個狀態變量而後使用if-else條件塊來表示基於不一樣狀態的行爲。狀態模式用於提供一個系統的低耦合的方法來經過上下文和狀態繼承來實現的。看文章State Pattern來看具體的詳細實現以及代碼實例。

8.訪問者模式(Visitor Pattern)

訪問者模式被用於當咱們必須在一組類似的對象中進行一個操做的時候。使用訪問者模式,咱們能夠講操做邏輯從一個對象移到另一個類中。

例如,想象一個超市的手推車咱們能夠在裏面添加不一樣的東西,當咱們點擊出帳按鈕時,它就會計算須要付錢的總量。如今咱們有在具體的計算邏輯或者咱們能夠把這個邏輯使用觀察者模式移到其餘的類中。看文章Visitor Pattern來看看那具體的實現。

9.解釋器模式(Interpreter Pattern)

解釋器模式用於對於一個語言定義語法的表示而且提供處理這種語法的解釋器。

這個模式的最好的例子就是java編譯器來將java源代碼解釋成JVM可以理解的字節碼。Google的翻譯器就是解釋器模式的例子,以任何語言的輸入咱們均可以獲得被翻譯成的另外語言。看文章Interpreter Pattern來看下例子。

10.迭代器模式(Iterator Pattern)

迭代器模式是一種行爲型模式,它用於提供一個標準的方式去遍歷一組對象。迭代器模式中帶Java集合中獲得了大範圍的應用。

迭代器模式不只僅只是遍歷一個集合,咱們能夠根據咱們的需求提供不一樣類型的迭代器。迭代器模式隱藏了遍歷集合的具體實現,客戶端程序只須要使用迭代器方法。看文章Iterator Pattern來看下具體的實現。

11.備忘錄模式(Memento Pattern)

備忘錄設計模式用於當咱們想去保存一個對象的狀態而後在後來恢復這個狀態的狀況下。備忘錄模式經過首先保存這個對象的狀態數據可是不能經過外部對象來訪問,從而保護了保存數據的完整性。

備忘錄模式時經過兩個對象來實現的– Originator 和 Caretaker。Originator就是那個狀態須要保存和恢復的對象,它使用了內部類來保存對象的狀態。這個內部類就是被稱爲備忘錄並且他是私有的,全部並不能經過其餘對象來訪問它。看文章Memento Pattern來看下程序例子和詳細的實現。

這就是java 中全部的不一樣的設計模式,這篇文章提供了更容易瀏覽全部模式的目錄索引。

文章翻譯自:Java Design Patterns – Example Tutorial

相關文章
相關標籤/搜索