Design Pattern Overview

Design Pattern 提供某個情境下針對某問題的某種解決方法。這些解法通常是前人整理出來、經過驗證的。

  • 「情境」是某種不斷出現的狀況。
  • 「問題」是在某個情境下希望達到的目標,也可能是情境下的限制。
  • 「解決方法」希望是個 general 的設計,用來解決限制、達到目標。

常用來描述 design pattern 的方式是 GoF 書裡使用的格式。

使用 Design Pattern

能用簡單方法解決問題就用簡單方法。pattern 會為系統增加額外複雜度,只有需要的時候才使用。

使用 pattern 要注意是否有意義以及是否對系統其他部分造成影響,不要為了用而用。如果預期系統在未來會有實際的改變,也可以用 pattern 預先加上彈性。不過要注意,必須是實際的改變,而不是假定的改變。自己覺得可能會改變就用一堆 pattern 也不對,至於什麼叫做「未來實際會有的改變」又是另一個故事了……(喂

熟悉大部分 pattern 後,需要時大概會知道需要什麼 pattern,接著可以參考 pattern 的 motivation 確認想法對不對,再來要考量會不會對系統造成不良影響。設計上確認後,實作可以參考 UML 跟範例了解實作上的眉眉角角。

GoF 把 design pattern 分成三大類:creational、structural、behavioral patterns。有時候不知道確切需要哪個 pattern,可以先對問題分類再從類別中找適合的 pattern。

Design Pattern 分類

Creational pattern

處理「產生 object」。主要的目的有二,一是希望封裝 concrete class,二是想封裝「如何產生並結合 concrete class 的 instance」的過程。

  • Abstract Factory
  • Builder
  • Factory Method
  • Prototype
  • Singleton

Structural pattern

可以合成 class 跟 object 到更大的結構中。

Behavior pattern

重點在 class 與 object 間的互動,以及各自的責任。

Anti-pattern

anti-pattern 就是不好的 pattern,告訴大家什麼叫用不好的解決方式解決一個問題,好避免用到這些方法。一個好的 anti-pattern 除了說明不好的方法之外,會建議改用其他 pattern。不然就沒建設性啦

pattern 世界

除了 design pattern 之外,還有像特定領域如 concurrent 系統的 pattern、組織溝通上的 pattern、UI/UX 的 pattern 等等。pattern 是蠻 general 的概念,在蠻多領域都會出現的,共通的概念是「在面對某種重複出現的情境、狀況或問題時的應對方式」。

Ref