每個初心者練到一個程度之後,常常跑到網路上問,請問我該怎麼精進自己?
然後有些人這時候就會不負責任的跟他說,去看 Design Pattern。
接下來就是看了但是看不懂,在看幾遍還是想撞牆,最後放棄。
這就跟經典笑話一樣:
如果你想讓你的朋友放棄學寫程式,教他學 C++
我個人是覺得學這些東西還是不要刻意為之,多看開源框架,多看看別人寫的程式碼,再回頭讀一讀。
從實戰的範例中去體會,多體會幾遍才能理解他的使用情境,這樣才是真正的內化。
我在這邊只會提GOF的23個設計模式,但其實設計模式遠不只這些。
我在文末會留下一些關鍵字讓大家延伸閱讀。
Creational
有四個物件,工廠抽象介面及實作類 還有 產品的抽象介面及實作類,把建構的過程切得更細。
產品集的概念,基本上是組合多個工廠方法。
每個物件的子部分個別建構複雜,統一集中建構隱藏細節 (Fluent Interface)。
建立物件需耗費資源跟時間時,使用複製的方式來產生新物件。
讓該物件在執行期只有唯一實例產生,但須注意執行緒安全的問題,寫法有許多種(差別是延遲生成實例或是Java可以直接使用Enum)。
Structural
將目前的實現外掛上一個轉換來達到新功能,長相也像代理模式。
模組之間訂好溝通的協定或是抽象介面,方便實作類的切換,像是Java JDBC。
數個物件之間,呈現一種樹狀結構。物件之間可以組合。
傳入一個核心物件然後再為他加上額外的功能,長相很像代理模式。
限制外部對子模組的大量直接存取,設下一個固定入口,讓外部由此入口進入。
細瑣物件占用記憶體,設計成一起共用的概念,像是Java Sring Pool。
長相類似裝飾者,還能分為下面兩種,保護代理是為控制核心物件的存取、虛代理是控制資源延時載入。
Behavioral
在每個物件操作結束之後依序交後面那個物件繼續操作,像是Java Servlet Filter。
物件來代表實際行動,命令物件可以把行動(action)及其參數封裝起來。這些行動可以被重複或取消 像是Swing Action Listener。
定義特殊語言來讓操作更加直觀。
定義一個迭代器,用來遍歷資料結構,像是Java Collections裏頭十分常見。
擔任多個模組之間的溝通協調中繼角色,避免各模組之間大量直接溝通造成的副作用。
建立物件狀態復原點,通常會搭配clone使用,讓物件做出後續操作之後,如果出錯可以回復到上個復原點。
物件之間的相依變化,當一個被觀察者發生變化要callback觀察者做出動作。
以策略模式為基底,加上屬性來表示物件狀態,在每次操作的過程中需要維護物件的狀態。
傳入多個抽象介面並組合這些抽象介面的方法來定義演算法骨幹。
用一個抽象類別來定義演算法骨幹,把許多預設實現或是留待子類別實現的方法串起來,像是Spring JDBC Template。
把資料結構和邏輯分開,另外寫一個表示在資料結構內訪問主體的訪客類別,然後把處理交給這個類別來進行。
About Me
Jian-Min Huang
wide range skill set backend engineer
Research, Architecture, Coding, DB, Ops, Infra.
mainly write Java but also ❤️ Scala, Kotlin and Go