设计模式 (计算机)

在軟體工程中，設計模式（）是對軟體設計中普遍存在（反覆出現）的各種問題，所提出的解決方案。這個術語是由埃里希·伽瑪（Erich Gamma）等人在1990年代從建筑设计領域引入到計算機科學的。

設計模式並不直接用來完成程式碼的編寫，而是描述在各種不同情況下，要怎麼解決問題的一種方案。面向对象設計模式通常以類別或物件來描述其中的關係和相互作用，但不涉及用來完成應用程式的特定類別或物件。設計模式能使不穩定依賴於相對穩定、具體依賴於相對抽象，避免會引起麻煩的緊耦合，以增強軟體設計面對並適應變化的能力。

並非所有的軟體模式都是設計模式，設計模式特指軟體“設計”層次上的問題。還有其他非設計模式的模式，如架構模式。同时，演算法不能算是一種設計模式，因為演算法主要是用來解決計算上的問題，而非設計上的問題。

随着软件开发社群对设计模式的兴趣日益增长，已经出版了一些相关的专著，定期召开相应的研讨会，而且沃德·坎宁安（Ward Cunningham）为此发明了WikiWiki用来交流设计模式的经验。

發展歷史 
建筑师克里斯托佛·亚历山大在1977/79年编制了一本汇集设计模式的书，但是这种设计模式的思想在建筑设计领域里的影响远没有后来在软件开发领域里传播的广泛。

肯特·贝克和沃德·坎宁安在1987年，利用克里斯托佛·亚历山大在建筑设计领域里的思想开发了设计模式，并把此思想应用在Smalltalk中的图形用户接口（GUI）的生成中。一年后，埃里希·伽瑪在他的苏黎世大学博士毕业论文中开始尝试把这种思想改写为适用于软件开发。与此同时James Coplien 在1989年至1991年也在利用相同的思想致力于C++的开发，而后于1991年发表了他的著作Advanced C++ Programming Styles and Idioms。同年，埃里希·伽瑪得到了博士学位，然后去了美国，在那与Richard Helm、Ralph Johnson、John Vlissides 合作出版了《设计模式：可复用面向对象软件的基础》（） 一书，在此书中共收录了 23 種设计模式。

这四位作者在软件开发领域里以“四人帮”（英語，Gang of Four，简称GoF）而闻名，并且他们在此书中的协作导致了软件设计模式的突破。有時，GoF也會用於代指《设计模式》这本书。

表述格式 

表述一个软件设计模式的格式根据作者的不同，划分和名称等都会有所不同。常用的GoF描述模式的格式大致分为以下这些部分：

 模式名：每一个模式都有自己的名字，模式的名字使得我们可以讨论我们的设计。
 问题：在面向对象的系统设计过程中反复出现的特定场合，它导致我们采用某个模式。
 解决方案：上述问题的解决方案，其内容给出了设计的各个组成部分，它们之间的关系、职责划分和协作方式。
 别名：一個模式可以有超過一個以上的名稱。這些名稱應該要在這一節註明。
 动机：在哪種情況使用该模式，是本節提供的方案（包括問題與來龍去脈）的責任。
 適用性：模式適用於哪些情況、模式的背景等等。
 结构：這部分常用類圖與互動圖闡述此模式。
 参与者：這部分提供一份本模式用到的類與物件清單，與它們在設計下扮演的角色。
 合作：描述在此模式下，類與物件間的互動。
 影響：采用该模式对软件系统其他部分的影响，比如对系统的扩充性、可移植性的影响。影响也包括负面的影响。這部分應描述使用本模式後的結果、副作用、與权衡(trade-off)。
 實作：這部分應描述實現該模式、該模式的部分方案、實現該模式的可能技術、或者建議實現模式的方法。
 示例：簡略描繪出如何以程式語言來使用模式。
 已知应用：業界已知的實作範例。
 相关模式：這部分包括其他相關模式，以及與其他類似模式的不同。

分类 
《设计模式》一书原先把设计模式分为创建型模式、结构型模式、行为型模式，把它们通过授权、聚合、诊断的概念来描述。若想更进一步了解关于面向对象设计的背景，参考接口模式、内聚性。若想更进一步了解关于面向对象编程的背景，参考繼承，接口，多型。

參閱 
 设计范例
 反模式，对某个问题经常出现的、在设计中应该尽量避免的、坏的设计方案。
 模式挖掘
 软件重构
 程序设计实践

参考资料 

 Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides: Design Patterns, Addison-Wesley, 1995, hardcover, 395 pages, ISBN 978-0-201-63361-0, Design Patterns CD, 1997 ISBN 978-0-201-63498-3
 Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal: Pattern-oriented Software Architecture, Volume 1: A System of Patterns, John Wiley & Sons Ltd., ISBN 978-0-471-95869-7
 Douglas Schmidt: Pattern-oriented Software Architecture. Volume 2: Patterns for Concurrent and Networked Objects, John Wiley & Sons Ltd., ISBN 978-0-471-60695-6
 Alan Shalloway, James R. Trott: Design Patterns Explained: A New Perspective on Object-Oriented Design, Addison-Wesley, ISBN 978-0-201-71594-1
 Martin Fowler: Patterns of Enterprise Application Architecture, Addison-Wesley, ISBN 978-0-321-12742-6

外部連結 
 Java J2EE模式目录

 设计模式列表.
 mgrand的书介绍了许多模式
 hillside.net模式目录
 设计模式会通
 设计模式工具箱
 C#面向對象設計模式縱橫談系列課程
 设计模式目录