Skip to main content

Command Palette

Search for a command to run...

Design Pattern 設計模式總覽

將會持續更新

Published

在 Design Patterns: Elements of Reusable Object-Oriented Software 一書中,提出並總結了一些常見軟體設計問題的標準解決方案,稱為 Design Pattern。並將這些方法分為三大類:Creational、Structural、Behavioral。其中 Design Pattern 有六大原則:

七大原則

Open-Closed Principle 開放封閉原則

一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉

Liskov Substitution Principle 里氏替換原則

所有引用基類的地方必須能透明地使用其子類的物件

Single Responsibility Principle 單一職責原則

一個 Class 只負責一項職責

Dependency Inversion Principle 依賴反轉原則

  • 高層模組不應該依賴低層模組,兩者都應該依賴其抽象
  • 抽象不應該依賴細節
  • 細節應該依賴抽象

Interface Segregation Principles 介面隔離原則

一個 class 對另一個 class 的依賴應該建立在最小的介面上

Law of Demeter / Least Knowledge Principle 迪米特原則

一個物件應該對其他物件有最少的瞭解

Composite Reuse Principle 合成複用原則

儘量使用合成/聚合的方式,而不是使用繼承

  • Creational 創建型

    用於處理建立物件的模式,其核心思想是要把物件的建立和使用分離。

    • Abstract factory 抽象工廠模式:提供一個建立相關或依賴物件的介面,而不指定物件的具體類
    • Builder 生成器模式:將一個複雜物件的建立與它的表示分離,使同樣的建立過程可以建立不同的表示
    • Dependency Injection 相依注入模式:傳遞依賴給調用方,而不是讓讓調用方直接獲得依賴
    • Factory method 工廠模式:允許一個類別的實例化推遲到子類中進行
    • Lazy initialization 延遲初始化模式:將物件的建立,某個值的計算,或者其他代價較高的過程推遲到它第一次需要時進行
    • Multiton 多例模式:確保一個類只有命名的實例,並提供對這些實例的全域存取
    • Object pool 物件池模式:通過回收不再使用的物件,避免建立和銷毀物件時代價高昂的取得和釋放資源的過程
    • Prototype 原型模式:使用原型實例指定要建立的物件類型,通過複製原型建立新的物件
    • RAII 資源取得即初始化模式:通過繫結到合適物件的生命周期來確保資源被適當地釋放
    • Singleton 單例模式:保證一個類只有一個實例,並且提供對這個實例的全域存取方式
  • Structural 結構型

    處理 class 和 object 的組合

    • Adapter 轉接器模式:將一個物件的介面'轉接'成當事人預期的樣子
      • Adapter pipeline 轉接器導管模式:因除錯目的而使用多個轉接器
      • Retrofit Interface:同時使用多個類別的介面的轉接器
    • Bridge 橋接模式:將一個抽象與實現解耦,以便兩者可以獨立的變化
      • Tombstone 墓碑模式:一種中介的查詢物件,包含物件的實際位址
    • Composite 組合模式:樹狀結構的物件,每個物件有相同的介面
      • Aggregate 聚集模式:一種組合模式的版本,包含用於聚集子成員的成員函式
    • Decorator 修飾模式:對一個執行的類別,若使用繼承方式加上新功能可能會新類別的數量呈指數型地增加,可使用此模式來解決
    • Delegation
    • Extensibility 擴充模式:亦即框架,將複雜的程式碼隱藏在簡單的介面後
    • Facade 外觀模式:對於已有的介面建立一個簡化的介面以簡化使用共通任務
    • Flyweight 享元模式:通過共享以便有效的支持大量小顆粒對象
    • Front controller
    • Maker interface:
    • Module
    • Pipes and filters 導線及過濾器模式:一串的處理者,其中每個處理者的輸出是下一個的輸入
    • Opaque pointer
    • Proxy 代理模式:為其他對象提供一個代理以控制對這個對象的訪問
    • Twin
  • Behavioral 行為型

    用來識別對象之間的常用交流模式並加以實現

    • Blackboard 黑板模式:
    • Chain of responsibility 責任鏈模式:處理命令物件或將之傳到下一個可以處理的物件
    • Command 命令模式:命令物件將動作及參數封裝起來
    • "Externalize the stack" "具現化堆疊":使用堆疊將遞迴函式轉成重覆執行
    • Interpreter 直譯器模式:實作特製化的程式語言以解決一系列特殊的問題
    • Iterator 迭代器模式:迭代器用於存取包含器中元素而不用透露底層實作的方式
    • Mediator 調停者模式:對子系統中的介面集面提供一個統一的介面
    • Memento 備忘錄模式:使一個物件還原到前一個狀態的能力(rollback)
    • Null object 空物件模式:扮演預設物件的角色
    • Observer 觀察者模式:亦即發行/訂閱或事件聆聽者。物件註冊去聆聽由另一個物作所引發的事件
      • Weak reference 弱參照模式:將觀察者與可觀察間的藕合程度
    • Protocol stack 協議棧:通訊是由許多封裝成階層式的層所處理
    • Scheduled-task 排程任務模式:在特定區時或時間點執行排程任務(用於即時計算)
    • Servant 僱工模式:
    • Single-serving visitor:最佳化訪問者。使用一次後即行刪除
    • Specification 規格模式:以布林值的方式來重組事務邏輯
    • State 狀態模式:在執行可以部分改變物件的一種方法
    • Strategy 策略模式:在執行時依需求而選擇演算法
    • Template method 模板方法模式:描述一個程式的骨架
    • Visitor 觀察者模式:一種從物件中取出演算法的方式
  • Concurrency 併發型

    用來處理多執行緒編程範式的一類設計模式

    • Active Object 主動物件模式:
    • Actor
    • Balking 阻礙模式:
    • Barrier
    • Binding properties
    • Coroutine
    • Compute kernel
    • Double-checked locking 雙重檢查鎖定模式:
    • Event-based asynchronous
    • Fiber
    • Futex
    • Futures and promises
    • Guarded suspension 守衛模式:
    • Immutable object
    • Join
    • Leaders/followers
    • Lock
    • Messaging
    • Monitor object 監視物件模式:
    • Nuclear reaction
    • Proactor
    • Reactor 反應器模式:
    • Read write lock 讀寫鎖模式:
    • Scheduler 調度者模式:
    • STM
    • Thread pool 執行緒池模式:
    • Thread-local storage 執行緒本地儲存模式:

Reference

  • https://refactoring.guru/design-patterns
  • https://iter01.com/516990.html
  • https://www.wikiwand.com/zh-tw/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F_(%E8%AE%A1%E7%AE%97%E6%9C%BA)
  • https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/589577

Software development

Part 44 of 50

A series about software engineering

Up next

Front-end: CSS 單位總表

隨時更新

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.