在1994年,Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides所著的《Design Patterns: Elements of Reusable Object-Oriented Software》一書,成為了軟體工程領域的里程碑。該書不僅介紹了軟體設計模式的主要概念,還深入討論了物件導向程式設計的優勢與挑戰,並且為軟體開發者提供了23種經典的設計模式作為參考。
「程式要依賴介面,而非實作。」
在這本書中,作者強調了介面的重要性,指出設計者應優先考量介面而不是具體的實作。他們認為這樣可擴展性更高,使得客戶端能夠使用不同的實作,只要它們遵循相同的介面。這種方法促進了動態綁定和多態性,並且是物件導向程式設計的核心特徵之一。
除了介面之外,作者也提到繼承與聚合的概念,提出「白箱重用」與「黑箱重用」的區別。白箱重用指的是子類別能夠訪問父類別的詳細資訊,這可能會損害封裝的完整性,反之,黑箱重用則透過清晰的介面來隱藏實作細節,增加了模組之間的獨立性。
「繼承使得子類別暴露於父類別的實作細節中,因此常被指責為打破了封裝。」
這本書同時也是四位作者在1990年於OOPSLA會議上的一次想法交流中開始酝酿的。隨著時間的推移,這個想法逐漸演變成為我們如今所熟知的設計模式,並且在全球銷售超過500,000本,證明了其對軟體工程的巨大影響。
根據功能不同,這23種設計模式可以被歸類為創建型、結構型和行為型三大類型。
創建型模式主要負責對象的創建,能使程式在確定具體類別之前,保持更大的彈性。這些模式包括:抽象工廠模式、建造者模式、工廠方法模式、原型模式和單例模式。
結構型模式主要關注類別和對象的組合,這些模式定義了如何組合對象以獲得新的功能。包括:適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式和代理模式。
行為型模式則關注對象之間的通信與協作。這些模式包括:責任鏈模式、命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察者模式、狀態模式、策略模式、模板方法模式和訪問者模式。
「設計模式是為了解決在面對複雜軟體時可能遇到的共同問題。」
自出版以來,這本書對於軟體開發社群的影響不容忽視,使得許多開發者在進行軟體設計時能參考這些模式以提升程式的可讀性和可維護性。然而,它們也受到一些批評,認為這些模式只是彌補C++等語言缺失特性的權宜之計,並且會使得程式碼變得更加冗長。
例如,知名程式設計師Paul Graham曾表示,看到程式中的模式會讓他感到困擾,因為他認為程式的結構應該只反映解決問題的需求,而不應包含任何額外的規律性。相對的,Peter Norvig則指出,許多設計模式在其他編程語言中可以通過語言自身的特性得到簡化或完全消除。
即便存在爭議,設計模式仍然是當今軟體設計的重要憑藉。不少開發者在設計軟體架構時持續參考這些理論,尋求更有效率的解決方案。這本書也為許多後續的研究和書籍打開了思路。
在2005年,這四位作者獲得了ACM SIGPLAN頒發的年度程式語言成就獎,以表彰他們的工作對程式設計和程式語言設計的深遠影響。他們也於2005年進行過討論,評估如果重新編排此書會有何改變,這使得設計模式的後續發展更加受到廣泛關注。
設計模式的出現對於今日的軟體開發有多大的影響?