軟體設計模式
如果你還記得,軟體工程師使用一種叫做 UML 的通用語言。如果我們用語言的類比,那麼設計模式就是我們文化中共享的通用故事,比如童話故事。它們是關於軟體設計中常見問題及其解決方案的故事。正如年幼的孩子從童話故事中學習善惡,初級軟體工程師從好的設計(設計模式)和不好的設計(反模式)中學習。
在軟體工程中,設計模式是針對軟體設計中常見問題的一種通用可複用解決方案。設計模式不是可以直接轉換為程式碼的最終設計,它是一種描述或模板,說明如何解決可以在許多不同情況下使用的問題。面向物件的設計模式通常顯示類或物件之間的關係和互動,而沒有指定所涉及的最終應用程式類或物件。
設計模式存在於模組和互連的領域。在更高層次上,存在範圍更大的架構模式,通常描述整個系統遵循的總體模式。[1]
設計模式有很多型別:結構型模式解決與正在開發的應用程式的高階結構相關的關注點。計算模式解決與識別關鍵計算相關的關注點。演算法策略模式解決與描述如何在計算平臺上利用應用程式特徵的高階策略相關的關注點。實現策略模式解決與實現原始碼以支援程式本身的組織方式以及特定於並行程式設計的常見資料結構相關的關注點。執行模式解決與支援應用程式的執行相關的關注點,包括執行任務流的策略以及支援任務之間同步的構建塊。
檢視具體示例時,設計模式最容易理解。對於初學者來說,以下十種模式就足夠了。但是,你應該養成學習下面提到的其他一些模式的習慣。你瞭解的模式越多越好。
工廠模式根據某個引數(通常是字串)從一組類似的類中建立一個物件。例如,在 Java 中建立 MessageDigest 物件
MessageDigest md = MessageDigest.getInstance("SHA-1");
例如,如果將引數更改為 "MD5",則會獲得一個根據 MD5 演算法計算訊息摘要的物件。使用引數的優點是,更改演算法不需要重新編譯程式碼。此模式的其他示例是使用 Class.forName("jdbc.idbDriver") 載入 Java 中的資料庫連線驅動程式,這雖然是一種非常奇怪的語法,但基本原理相同。
工廠模式隻影響一個類,而抽象工廠模式影響一整組類。Java 中的一個眾所周知的例子是 Swing Look-and-Feels
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
這看起來與工廠模式非常相似,但區別在於現在正在載入的每個 Swing 類都會受到影響,而不僅僅是一個類。
這是最危險的設計模式之一,如果有疑問,就不要使用它。它的主要目的是保證特定物件的例項只有一個。可能的應用是印表機管理器或資料庫連線管理器。當需要控制對有限資源的訪問時,它很有用。
如今,迭代器模式非常簡單:它允許你遍歷一個物件列表,從開頭開始,依次遍歷列表中的每個元素,直到到達末尾。
模板方法模式也很簡單:只要你定義了一個抽象類,該類強制其子類實現某些方法,你就在使用模板模式的簡單形式。
要了解命令模式背後的理念,請考慮以下餐廳示例:顧客去餐廳點餐。服務員接受訂單(命令,在本例中)並將訂單交給廚房的廚師。在廚房裡,命令被執行,並且根據命令準備不同的食物或飲料。
觀察者模式是最流行的模式之一,並且有許多變體。假設您在電子表格中有一個表格。這些資料可以以表格形式顯示,也可以以圖表或直方圖的形式顯示。如果基礎資料發生變化,不僅表格檢視需要更改,而且您還期望直方圖發生變化。為了傳達這些變化,您可以使用觀察者模式:基礎資料是可觀察物件,表格檢視和直方圖檢視是觀察者,它們觀察可觀察物件。觀察者模式的另一個例子是 Swing 中的按鈕:這裡 JButton 是可觀察物件,如果按鈕發生了一些事情(通常意味著它被使用者按下),那麼監聽器(觀察者)就會收到通知。
組合模式非常普遍。基本上,它是一個列表,它可能包含物件,也可能包含列表。一個典型的例子是檔案系統,它可能由目錄和檔案組成。這裡目錄可能包含檔案,也可能包含其他目錄。組合模式的其他例子是包含其他選單的選單,或者在使用者管理中,人們經常有使用者和組,其中組可能包含使用者,也可能包含其他組。
在狀態模式中,物件的內部狀態會影響其行為。假設您有一些繪圖程式,您希望能夠繪製直線和虛線。與其為直線建立不同的類,不如建立一個 Line 類,它有一個名為“dotted”或“straight”的內部狀態,並且根據這個內部狀態,繪製虛線或直線。例如,當透過“setFont()”設定字型或透過“setColor()”設定顏色時,Java 也隱式地使用了這種模式。
代理模式背後的想法是我們有一些複雜的物件,我們需要讓它變得更簡單。一個典型的應用是一個存在於另一臺機器上的物件,但您想給使用者一種印象,就好像使用者正在處理本地物件一樣。另一個應用是當一個物件需要很長時間才能建立(比如載入大型影像/影片),但實際上可能永遠不需要這個物件。在這種情況下,代理代表物件,直到需要它為止。
設計模式可以透過提供經過測試和驗證的開發正規化來加快開發過程。有效的軟體設計需要考慮在實現後期才可能出現的問題。重用設計模式有助於防止可能導致重大問題的細微問題,並且它還提高了熟悉這些模式的編碼人員和架構師的程式碼可讀性。除此之外,模式允許開發人員使用眾所周知、易於理解的軟體互動名稱進行交流。
為了實現靈活性,設計模式通常會引入額外的間接層,這在某些情況下可能會使最終的設計變得複雜並影響應用程式的效能。
根據定義,模式必須在新應用程式中重新程式設計才能使用。由於某些作者認為這與元件提供的軟體重用相比是一步倒退,因此研究人員一直在努力將模式轉變為元件。Meyer 和 Arnout 能夠完全或部分元件化他們嘗試的三分之二的模式。[2]
設計模式最初被分為三類:建立型模式、結構型模式和行為型模式,並使用委託、聚合和諮詢的概念進行描述。另一種分類也引入了架構設計模式的概念,它可以應用於軟體的架構級別,例如模型-檢視-控制器模式。以下模式取自設計模式[3] 和程式碼大全[4],除非另有說明。
- 抽象工廠:提供一個介面用於建立相關或依賴物件的家族,而無需指定它們的具體類。
- 建造者:將複雜物件的構造與其表示分離,允許相同的構造過程建立不同的表示。
- 工廠方法:定義一個用於建立物件的介面,但讓子類決定要例項化的類。工廠方法允許類將例項化推遲到子類。
- 延遲初始化:延遲建立物件、計算值或其他一些昂貴過程的策略,直到第一次需要時才執行。[5]
- 多例模式:確保一個類只有命名例項,並提供對它們的全域性訪問點。
- 物件池:透過回收不再使用的物件來避免昂貴的資源獲取和釋放。可以被認為是連線池和執行緒池模式的泛化。
- 原型模式:使用原型例項指定要建立的物件型別,並透過複製該原型來建立新物件。
- 資源獲取即初始化:透過將資源繫結到合適的物件的生存期來確保資源被正確釋放。
- 單例模式:確保一個類只有一個例項,並提供對它的全域性訪問點。
- 介面卡模式或包裝器模式:將一個類的介面轉換為客戶端所期望的另一個介面。介面卡模式允許原本因介面不相容而無法一起工作的類協同工作。
- 橋接模式:將抽象與實現解耦,允許兩者獨立變化。
- 組合模式:將物件組合成樹形結構,以表示部分-整體層次結構。組合模式允許客戶端以統一的方式處理單個物件和物件的組合。
- 裝飾器模式:動態地向物件附加額外的職責,同時保持相同的介面。裝飾器模式為擴充套件功能提供了比子類化更靈活的替代方案。
- 外觀模式:為子系統中的一組介面提供統一的介面。外觀模式定義了一個更高級別的介面,使子系統更容易使用。
- 前端控制器模式:為子系統中的一組介面提供統一的介面。前端控制器模式定義了一個更高級別的介面,使子系統更容易使用。
- 享元模式:使用共享來有效地支援大量細粒度的物件。
- 代理模式:為另一個物件提供一個代理或佔位符,以控制對它的訪問。
- 黑板模式:泛化的觀察者模式,允許多個讀取器和寫入器。在系統範圍內傳達資訊。
- 責任鏈模式:透過讓多個物件有機會處理請求,避免將請求傳送者與其接收者耦合。將接收物件連結起來,並將請求沿著鏈傳遞,直到某個物件處理它為止。
- 命令模式:將請求封裝成一個物件,從而允許您使用不同的請求引數化客戶端,對請求進行排隊或記錄,並支援可撤消的操作。
- 直譯器模式:給定一種語言,定義其語法的表示以及使用該表示來解釋語言中的句子的直譯器。
- 迭代器模式:提供一種以順序方式訪問聚合物件元素的方法,而無需公開其底層表示。
- 中介者模式:定義一個物件,它封裝了一組物件如何互動。中介者模式透過防止物件顯式地相互引用來促進松耦合,並且允許您獨立地改變它們的互動。
- 備忘錄模式:在不違反封裝的情況下,捕獲並外部化物件的內部狀態,允許物件稍後恢復到此狀態。
- 空物件模式:透過提供一個預設物件來避免空引用。
- 觀察者模式或釋出/訂閱模式:定義物件之間的一對多依賴關係,其中一個物件的狀態更改會導致其所有依賴項被自動通知並更新。
- 服務員模式:為一組類定義通用功能。
- 規格模式:以布林方式重新組合業務邏輯。
- 狀態:允許物件在內部狀態改變時改變其行為。該物件將看起來像改變了其類。
- 策略:定義一系列演算法,封裝每個演算法,並使它們可以互換。策略使演算法能夠獨立於使用它的客戶端而變化。
- 模板方法:在操作中定義演算法的骨架,將一些步驟推遲到子類中。模板方法允許子類重新定義演算法的某些步驟,而無需更改演算法的結構。
- 訪問者:表示要對物件結構元素執行的操作。訪問者允許你定義新的操作,而無需更改其操作的元素的類。
以下大多數併發模式取自POSA2[6]
- 活動物件:將方法執行與駐留在自身控制執行緒中的方法呼叫分離。目標是透過使用非同步方法呼叫和用於處理請求的排程程式來引入併發。
- 推遲:僅在物件處於特定狀態時才對物件執行操作。
- 繫結屬性:組合多個觀察者以強制不同物件中的屬性以某種方式同步或協調。[7]
- 訊息傳遞模式:訊息傳遞設計模式 (MDP) 允許元件和應用程式之間交換資訊(即訊息)。
- 雙重檢查鎖定:透過首先以不安全的方式測試鎖定條件(“鎖定提示”)來減少獲取鎖的開銷;只有在成功的情況下才會進行實際鎖定。在某些語言/硬體組合中實現時可能不安全。因此,有時它被認為是一種反模式。
- 基於事件的非同步:解決多執行緒程式中非同步模式出現的問題。[8]
- 保護性暫停:管理需要獲取鎖和滿足先決條件才能執行的操作。
- 監視器物件:其方法受互斥影響的物件,從而防止多個物件錯誤地嘗試同時使用它。
- 反應器:反應器物件為必須同步處理的資源提供非同步介面。
- 讀寫鎖:允許對物件進行併發讀取訪問,但寫入操作需要獨佔訪問。
- 排程程式:明確控制執行緒何時可以執行單執行緒程式碼。
- 執行緒池:建立一定數量的執行緒來執行一定數量的任務,這些任務通常組織在一個佇列中。通常,任務比執行緒多得多。可以看作是物件池模式的特例。
- 執行緒特定儲存:特定於執行緒的靜態或“全域性”記憶體。
另一個模式在資料訪問模式領域有著廣泛應用的有趣領域。Clifton Nock [10] 列出了以下模式
- ORM 模式:域物件工廠、物件/關係對映、更新工廠
- 資源管理模式:資源池、資源計時器、重試器、分頁迭代器
- 快取模式:快取訪問器、按需快取、預先載入快取、快取收集器、快取複製器
- 併發模式:事務、樂觀鎖、悲觀鎖
如果你使用 J2EE 或 .Net 企業應用程式,出現的錯誤和解決方案是相似的。這些解決方案是企業模式。核心 J2EE 模式[11] 列出了這些模式
- 表示層模式:攔截過濾器、前端控制器、檢視幫助程式、複合檢視、服務到工作者、排程程式檢視
- 業務層模式:業務委託、值物件、會話外觀、複合實體、值物件組裝器、值列表處理程式、服務定位器
- 整合層模式:資料訪問物件、服務啟用器
最後,在即時和嵌入式軟體開發領域,已經識別出大量模式。[12][13] 在他的書即時設計模式:即時系統的健壯可擴充套件架構[14][15] Bruce Powel Douglass 列出了一些非常有趣的模式
- 架構模式:分層模式、通道架構模式、基於元件的架構、遞迴包含模式和分層控制模式、微核心架構模式、虛擬機器模式
- 併發模式:訊息佇列模式、中斷模式、保護呼叫模式、會合模式、迴圈執行模式、迴圈模式
- 記憶體模式:靜態分配模式、池分配模式、固定大小緩衝區模式、智慧指標模式、垃圾收集模式、垃圾壓縮模式
- 資源模式:臨界區模式、優先順序繼承模式、優先順序上限模式、同時鎖定模式、有序鎖定模式
- 分佈模式:共享記憶體模式、遠端方法呼叫模式、觀察者模式、資料匯流排模式、代理模式、代理模式
- 安全性和可靠性模式:監視器-執行器模式、健全性檢查模式、看門狗模式、安全執行模式、保護的單通道模式、同構冗餘模式、三模冗餘模式、異構冗餘模式
人們還努力在特定領域對設計模式進行編碼,包括使用現有設計模式以及特定於領域的模式。例如,使用者介面設計模式,[16] 資訊視覺化 [17],安全設計[18],“安全可用性”[19],Web 設計 [20] 和商業模式設計。[21] 每年舉辦的程式設計模式語言會議記錄[22] 包含許多特定於領域的模式示例。
假設你發現了一個新的設計模式。或者你的朋友想向你解釋她在模式庫中找到的這個很酷的模式。我們如何描述模式?沒有單一的標準格式來記錄設計模式。相反,不同的模式作者使用了各種不同的格式。[23] 但是,根據 Martin Fowler,某些模式形式比其他形式更有名,因此成為新模式寫作工作中常見的起點。[24] 設計模式一書使用了一種常用的文件格式。[3] 它包含以下部分
- 模式名稱和分類:有助於識別和引用模式的描述性和唯一名稱。
- 意圖:對模式背後的目標和使用它的原因的描述。
- 別名:模式的其他名稱。
- 動機(驅動力):一個包含問題和可以使用此模式的上下文的場景。
- 適用性:可以使用此模式的情況;模式的上下文。
- 結構:模式的圖形化表示。類圖和互動圖可以用於此目的。
- 參與者:模式中使用的類和物件的列表以及它們在設計中的角色。
- 協作:對模式中使用的類和物件如何相互互動的描述。
- 後果:使用模式引起的結果、副作用和權衡的描述。
- 實現:模式的實現描述;模式的解決方案部分。
- 示例程式碼:模式如何在程式語言中使用的示例。
- 已知用途:模式的真實使用示例。
- 相關模式:與模式有一定關係的其他模式;模式與類似模式之間差異的討論。
結構、參與者和協作部分尤其令人關注。這些部分描述了一個設計動機:一個開發者複製並適應其特定設計以解決設計模式描述的重複問題的原型微架構。微架構是一組程式組成部分(例如,類、方法...)及其關係。開發者透過在其設計中引入此原型微架構來使用設計模式,這意味著他們設計中的微架構將具有與所選設計動機相似的結構和組織。
模式起源於克里斯托弗·亞歷山大(1977/79)提出的一個建築概念。1987 年,肯特·貝克和沃德·坎寧安開始嘗試將模式應用於程式設計,並在當年的 OOPSLA 會議上展示了他們的成果。[25][26] 在接下來的幾年裡,貝克、坎寧安和其他人繼續進行這項工作。
設計模式在 1994 年“四人幫”(Gamma 等)出版的《設計模式:可複用面向物件軟體元素》一書之後在計算機科學領域獲得了普及。[3] 同年,第一次程式設計模式語言大會召開,次年,波特蘭模式庫建立,用於設計模式的文件記錄。
- ↑ Martin, Robert C. "設計原則和設計模式" (PDF). Retrieved 2000.
{{cite web}}: Check date values in:|accessdate=(help) - ↑ Meyer, Bertrand (2006). "元件化:訪問者示例" (PDF). IEEE Computer. IEEE. 39 (7): 23–30.
{{cite journal}}: Unknown parameter|coauthors=ignored (|author=suggested) (help); Unknown parameter|month=ignored (help) - ↑ a b c Gamma, Erich (1995). 設計模式:可複用面向物件軟體元素. Addison-Wesley. ISBN 0-201-63361-2.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - ↑ McConnell, Steve (2004). "設計在建設中". 程式碼大全 (第二版). Microsoft Press. p. 104. ISBN 978-0735619678.
表 5.1 常用設計模式
{{cite book}}: Unknown parameter|month=ignored (help) - ↑ a b Fowler, Martin (2002). 企業應用架構模式. Addison-Wesley. ISBN 978-0321127426.
- ↑ , 除非另有說明。 Schmidt, Douglas C. (2000). 面向模式的軟體架構,第二卷:併發和聯網物件的模式. John Wiley & Sons. ISBN 0-471-60695-2.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - ↑ http://c2.com/cgi/wiki?BindingProperties
- ↑ Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, and Morgan Skinner (2008). "基於事件的非同步模式". 專業 C# 2008. Wiley. pp. 570–571. ISBN 0470191376.
{{cite book}}: Unknown parameter|isbn13=ignored (help)CS1 maint: multiple names: authors list (link) - ↑ http://c2.com/cgi/wiki?LockPattern
- ↑ Nock, Clifton (2003). 資料訪問模式:面向物件應用程式中的資料庫互動. Addison Wesley. ISBN 0131401572.
- ↑ Alur, Deepak (2003). 核心 J2EE 模式:最佳實踐和設計策略(第 2 版). Prentice Hall. ISBN 0131422464.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助); 未知引數|month=被忽略 (幫助) - ↑ "STL 設計模式 II". EventHelix.com Inc. 檢索於 2011-03-08.
- ↑ "嵌入式設計模式". EventHelix.com Inc. 檢索於 2011-03-08.
- ↑ Douglass, Bruce Powel (2002). 即時設計模式:即時系統健壯可擴充套件架構. Addison Wesley. ISBN 0201699567.
- ↑ Douglass, Bruce Powel (1999). 艱苦時光:使用 UML、物件、框架和模式開發即時系統. Addison Wesley. ISBN 0201498375.
{{cite book}}: 在|title=位置 65 處的換行符 (幫助) - ↑ Laakso, Sari A. (2003-09-16). "使用者介面設計模式的集合". 赫爾辛基大學,計算機科學系. 檢索於 2008-01-31.
- ↑ Heer, J. (2006). "資訊視覺化的軟體設計模式". IEEE 視覺化與計算機圖形學彙刊. 12 (5): 853. doi:10.1109/TVCG.2006.178. PMID 17080809.
{{cite journal}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - ↑ Chad Dougherty; 等 (2009). 安全設計模式 (PDF). 卡內基梅隆大學軟體工程研究所.
{{cite book}}: 在|author=中顯式使用等 (幫助); 無效|nopp=Technical Report(幫助); 未知引數|nopp=被忽略 (|no-pp=建議) (幫助) - ↑ Simson L. Garfinkel (2005). 同時安全且易用的計算機系統的設計原則和模式. 麻省理工學院.
{{cite book}}: 無效|nopp=PhD Thesis(幫助); 未知引數|nopp=被忽略 (|no-pp=建議) (幫助) - ↑ "雅虎!設計模式庫". 檢索於 2008-01-31.
- ↑ "如何將您的商業模式設計為精益創業?". 檢索於 2010-01-06.
- ↑ 程式設計模式語言,會議記錄(每年,1994—)[1]
- ↑ Gabriel, Dick. "模式定義". 存檔於 原始 on 2007-02-09. 檢索於 2007-03-06.
- ↑ Fowler, Martin (2006-08-01). "編寫軟體模式". 檢索於 2007-03-06.
- ↑ Smith, Reid (1987年10月). "面板設計方法". OOPSLA '87 附錄. OOPSLA '87. doi:10.1145/62138.62151., "沃德告誡不要在所謂的'高階嚮導'中要求過多的程式設計。他指出,書面'模式語言'可以顯著提高抽象的選擇和應用。他提出了一種'將設計和實現負擔進行根本性轉變'的新方法,這種方法基於對克里斯托弗·亞歷山大的模式語言作品的改編,而泰克特羅尼克斯開發的面向程式設計的模式語言極大地幫助了他們的軟體開發工作。"
- ↑ Beck, Kent; Ward Cunningham (1987年9月). "使用模式語言進行面向物件程式設計". OOPSLA '87 面向物件程式設計規範和設計研討會. OOPSLA '87. http://c2.com/doc/oopsla87.html. 檢索於 2006-05-26.
- 書籍
- Alexander, Christopher (1977). 模式語言:城鎮、建築、建造. 紐約: 牛津大學出版社. ISBN 978-0195019193.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - Gamma, Erich (1995). 設計模式:可複用面向物件軟體元素. 艾迪生-韋斯利. ISBN 0-201-63361-2.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - Buschmann, Frank (1996). 面向模式的軟體體系結構,第 1 卷:模式系統. 約翰·威利父子公司. ISBN 0-471-95869-7.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - Schmidt, Douglas C. (2000). 面向模式的軟體體系結構,第 2 卷:併發和網路物件模式. 約翰·威利父子公司. ISBN 0-471-60695-2.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - Fowler, Martin (2002). 企業應用程式體系結構模式. 艾迪生-韋斯利. ISBN 978-0321127426.
- Hohpe, Gregor (2003). 企業整合模式:設計、構建和部署訊息解決方案. 艾迪生-韋斯利. ISBN 0-321-20068-3.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - Freeman, Eric T (2004). 深入淺出設計模式. O'Reilly Media. ISBN 0-596-00712-4.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - Alur, Deepak (2003). 核心 J2EE 模式:最佳實踐和設計策略(第 2 版). 普倫蒂斯-霍爾. ISBN 0131422464.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help); Unknown parameter|month=ignored (help) - Beck, Kent (2007). 實現模式. 艾迪生-韋斯利. ISBN 978-0321413093.
{{cite book}}: Cite has empty unknown parameter:|coauthors=(help); Unknown parameter|month=ignored (help) - Beck,Kent (1996). 第 18 屆國際軟體工程會議論文集. pp. 25–30.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助); 未知引數|month=被忽略 (幫助) - Nock,Clifton (2003). 資料訪問模式:面向物件應用程式中的資料庫互動. Addison Wesley. ISBN 0131401572.
- Borchers,Jan (2001). 一種互動設計模式方法. John Wiley & Sons. ISBN 0-471-49828-9.
- Coplien,James O. (1995). 程式設計模式語言. Addison-Wesley. ISBN 0-201-60734-4.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Coplien,James O. (1996). 程式設計模式語言 2. Addison-Wesley. ISBN 0-201-89527-7.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Fowler,Martin (1997). 分析模式:可重用物件模型. Addison-Wesley. ISBN 0-201-89542-0.
- Fowler, Martin (2002). 企業應用程式體系結構模式. 艾迪生-韋斯利. ISBN 978-0321127426.
- Freeman,Eric (2004). 深入淺出設計模式. O'Reilly Media. ISBN 0-596-00712-4.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Hohmann,Luke (2003). 超越軟體架構. Addison-Wesley. ISBN 0-201-77594-8.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Alur,Deepak (2004). 深入淺出設計模式. O'Reilly Media. ISBN 0-596-00712-4.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Gabriel,Richard (1996). 軟體模式:來自軟體社群的故事 (PDF). 牛津大學出版社. p. 235. ISBN 0-19-512123-6.
- Gamma,Erich (1995). 設計模式:可複用面向物件軟體的元素. Addison-Wesley. ISBN 0-201-63361-2.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Hohpe, Gregor (2003). 企業整合模式:設計、構建和部署訊息解決方案. 艾迪生-韋斯利. ISBN 0-321-20068-3.
{{cite book}}: Unknown parameter|coauthors=ignored (|author=suggested) (help) - Holub,Allen (2004). Holub on Patterns. Apress. ISBN 1-59059-388-X.
- Kircher,Michael (2005). 遠端模式:企業、網際網路和即時分散式物件中介軟體的基礎. John Wiley & Sons. ISBN 0-470-85662-9.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Larman,Craig (2005). 應用 UML 和模式. Prentice Hall. ISBN 0-13-148906-2.
- Liskov, Barbara (2000). Java 程式開發:抽象、規範和麵向物件設計. Addison-Wesley. ISBN 0-201-65768-6.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Manolescu, Dragos (2006). 程式設計模式語言 5. Addison-Wesley. ISBN 0-321-32194-4.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Marinescu, Floyd (2002). EJB 設計模式:高階模式、流程和慣用法. John Wiley & Sons. ISBN 0-471-20831-0.
- Martin, Robert Cecil (1997). 程式設計模式語言 3. Addison-Wesley. ISBN 0-201-31011-2.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Mattson, Timothy G (2005). 並行程式設計模式. Addison-Wesley. ISBN 0-321-22811-1.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Shalloway, Alan (2001). 設計模式解析,第二版:面向物件設計的全新視角. Addison-Wesley. ISBN 0-321-24714-0.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助) - Vlissides, John M. (1998). 模式孵化:應用設計模式. Addison-Wesley. ISBN 0-201-43293-5.
- Weir, Charles (2000). 小型記憶體軟體:針對有限記憶體系統的模式. Addison-Wesley. ISBN 0201596075.
{{cite book}}: 未知引數|coauthors=被忽略 (|author=建議) (幫助)
- 網站
- "模式史". 波特蘭模式庫. 檢索於 2005-07-28.
- "設計模式是否遺漏了語言特性?". Cunningham & Cunningham, Inc. 檢索於 2006-01-20.
- "四人幫的公審". Cunningham & Cunningham, Inc. 檢索於 2006-01-20.
- "現代軟體工廠中的設計模式(WCSF)". XO Software, Ltd. 檢索於 2010-02-22.
- "STL 設計模式 II". EventHelix.com Inc. 檢索於 2011-03-08.
- "嵌入式設計模式". EventHelix.com Inc. 檢索於 2011-03-08.
- "企業整合模式". Gregor Hohpe 和 Bobby Woolf, Addison-Wesley. 檢索於 2011-03-08.
- 提供模式目錄的網站目錄 在 hillside.net。
- Ward Cunningham 的 波特蘭模式庫.
- 訊息設計模式 發表在第 17 屆模式語言程式大會 (PLoP 2010) 上。
- 模式和反模式 在 DMOZ
- PerfectJPattern 開源專案 旨在提供所有已知 Java 模式完整或部分元件化版本的模式庫。
- 精益創業商業模式模式 將設計模式思維應用於商業模式的例子
- Jt J2EE 面向模式的框架
- 可列印的設計模式快速參考卡
- 101 個設計模式和開發者提示
- 關於模式和模式語言 由 Buschmann、Henney 和 Schmidt 撰寫
- 指令碼應用程式模式
- 設計模式參考 在 oodesign.com
- 面向世界 70% 程式設計師的設計模式 由 Saurabh Verma 撰寫,釋出於 slideshare.com