設計模式是軟體開發中解決常見問題的經典方案,但許多開發者覺得它們抽象難懂。其實,每個模式都源自生活中的直觀經驗。本文用生活化的比喻,帶你輕鬆掌握 Java 23 種經典設計模式的核心精髓。
過去需要什麼人才就得自己去招聘,效率低下;現在有了人才市場(工廠),我們只需直接去挑選合適的人才。工廠模式將物件的創建邏輯封裝起來,客戶端無需知道具體創建細節,只需告知需求即可獲得所需物件。
早期手工作坊式逐個組裝零件,效率低且易出錯;工業革命帶來流水線,先定義產品結構(如豐田汽車由輪胎、方向盤、引擎組成),再按標準生產各部件,最後組裝成品。建造者模式將複雜物件的建構過程分步驟進行,靈活應對不同配置需求。
古時只能靠臨摹勉強模仿字跡;印刷術發明後,能完美複製原件。原型模式透過複製現有物件(克隆)來創建新物件,避免重新初始化的開銷,適合創建成本高昂的物件。
過去商標濫用導致侵權糾紛;商標法確立後,確保同一商標僅由單一實體擁有。單例模式確保全域僅存在單一實例,並提供全域存取點,常用於資源管理器、日誌記錄器等場景。
武當張三豐會太極拳,少林智空大師會金剛般若掌;若都拜為師,我便同時擁有兩門絕技。適配器模式將不相容的介面轉換為客戶期望的介面,讓原本不相容的類別能協同工作。
師父張三豐教我太極拳,我再自學蒙古摔跤,技藝超越師父。裝飾者模式在不改變原物件的前提下,動態地為物件添加新功能,比繼承更靈活。
馬有黑白之分、公母之別;單說「這是馬」太抽象,「黑色公馬」又太死板。橋接模式將抽象部分(馬)與實作部分(顏色、性別)分離,使它們能獨立變化,動態組合出「黑色的公馬」或「白色的母馬」。
子生孫、孫生子,子子孫孫無窮盡;將龐雜人口組織成按輩分排列的大家族樹狀結構。組合模式將物件組合成樹狀結構以表示「部分-整體」層次結構,讓客戶對單個物件和組合物件具有一致的處理方式。
高中畢業需讀初中、高中;博士也需讀初中、高中。國家將初高中普及為九年義務教育,提供統一介面。外觀模式為子系統提供一個統一的高層介面,降低客戶端與子系統的耦合度。
熟練三千常用漢字,足以應對日常讀寫;大腦建立漢字庫,避免重複造字。享元模式透過共享技術有效支援大量細粒度物件,避免大量相似物件的記憶體浪費。
清朝康熙年間四大輔政大臣代理朝政;皇帝不直接處理一切事務,而是透過大臣代理。代理模式為其他物件提供代理以控制對其的存取,適用於延遲載入、權限控制、日誌記錄等場景。
過去找房四處打聽效率低;現在有房屋仲介,向仲介提出需求,滿意則成交,不滿意繼續看下一間。責任鏈模式將請求的發送者與接收者解耦,請求沿著處理者鏈傳遞,直到被處理為止。
過去想殺誰就殺,後悟出長此以往結仇太多,改用借刀殺人。命令模式將請求封裝為物件,參數化其他物件,支援佇列、日誌、撤銷等操作,實現請求發送者與執行者解耦。
將一段文言文翻譯成白話文。解釋器模式定義語言文法並建立解釋器,用於解釋特定語言中的句子,適用於簡單語法的解析。
一個個搜尋,絕不放過任何一個。迭代器模式提供統一介面順序存取聚合物件內部元素,而不暴露內部結構。
原本錯綜複雜的債務關係,出現中介機構包辦一切,三角關係變成三方各自找中介。中介者模式用中介物件封裝物件間的交互,降低耦合度,將多對多關係轉為一對多。
我有多少,你就有多少。備忘錄模式在不破壞封裝性前提下,捕獲物件內部狀態並在外部儲存,以便日後恢復狀態(如撤銷操作)。
被監管對象一有異常,看管者立即反應。觀察者模式定義物件間一對多依賴,當一個物件狀態改變時,所有依賴者自動收到通知並更新。
門可進可出,人多混亂不安全;設保安限制進出,秩序井然。狀態模式允許物件在內部狀態改變時改變其行為,將狀態相關行為封裝在獨立類別中。
生病症狀多樣,長期摸索總結出感冒、肺病、肝炎等類型。策略模式定義演算法族群,封裝各演算法並使其可互換,讓演算法變化獨立於使用它的客戶端。
教練教學生游泳,教練自己不會也無妨。模板方法在父類別定義演算法骨架,將某些步驟延遲到子類別實現,子類別可不改變演算法結構即可重定義特定步驟。
張三殺人該死刑,李四偷竊該罰款;制定法律明確各罪刑罰,誰犯罪按條例處罰。訪問者模式將作用於資料結構中的各元素操作分離出來,使在不改變資料結構前提下定義新操作。