在軟體工程的世界裡,「設計模式」無疑是一個關鍵的概念。1994年,四位作者——Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides——合著的Design Patterns: Elements of Reusable Object-Oriented Software
一書首次系統性地闡述了這一理念,並為開發者提供了23種經典的設計模式。這本書不僅引發了軟體開發界的廣泛關注,更改變了我們對於編寫可重用和可擴展代碼的看法。
「程序設計應基於接口,而非具體實現。」
設計模式的起源可以追溯到1990年的OOPSLA會議,在這裡,Gamma和Helm初次相遇並發現了他們對於建立一個架構手冊的共同興趣。在隨後的數年中,他們與Johnson及Vlissides加入,最終於1994年共同出版了這本書。該書的影響力超越了語言的界限,至今已在全球售出超過500,000本,並被翻譯成13種語言。
在這本書中,第一章探討了物件導向設計的基本技術,作者提出了多項原則來促進良好的設計,像是:
「追求物件組合而非類別繼承。」
這一原則強調了接口的使用,使客戶端僅需關注於接口,而非具體實現,從而充分發揮了物件導向程式設計的動態綁定和多態性。
根據功能,設計模式可分為三種類型:創建型、結構型和行為型。每種類型都有其特定的應用場景和價值。
這些模式主要負責物件的創建,而不需直接實例化物件。例如,建造者模式能將複雜物件的構建與表示分離,從而簡化創建過程。
「單例模式僅允許一個類的實例被創建。」
結構型模式關注於類別和物件的組合,藉著繼承來組合接口並定義對象以獲得新功能。例如,適配器模式可以讓接口不兼容的類別協同工作,從而促進了靈活性。
行為型模式則主要探討物件之間的溝通方式。例如,觀察者模式允許多個觀察者對某一事件進行響應,實現了事件的發布/訂閱機制。
該書自出版以來,獲得了廣泛的讚譽。2005年,ACM SIGPLAN授予作者該年度的程式語言成就獎,以表彰其在程式設計實踐及語言設計方面的影響力。然而,設計模式也引發了不少的爭議。
「我在程式中看到模式時,認為這是問題的徵兆。」
一些批評認為,設計模式只是填補C++語言中缺失特性的應急方案,甚至被形容為“人類編譯器”。另外,使用較為靜態的語言如Lisp,許多設計模式可以被簡化或淘汰,顯示出語言特性的重大影響。
隨著軟體開發環境和技術的持續演進,設計模式仍然是開發者必須掌握的重要知識。然而,設計模式所提供的解決方案是否仍能滿足現代開發的需求?在使用設計模式時,開發者應該如何判斷其適用性及潛在的風險呢?