iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
0

前言

每個初心者練到一個程度之後,常常跑到網路上問,請問我該怎麼精進自己?

然後有些人這時候就會不負責任的跟他說,去看 Design Pattern。

接下來就是看了但是看不懂,在看幾遍還是想撞牆,最後放棄。

這就跟經典笑話一樣:

如果你想讓你的朋友放棄學寫程式,教他學 C++

我個人是覺得學這些東西還是不要刻意為之,多看開源框架,多看看別人寫的程式碼,再回頭讀一讀。

從實戰的範例中去體會,多體會幾遍才能理解他的使用情境,這樣才是真正的內化。

我在這邊只會提GOF的23個設計模式,但其實設計模式遠不只這些。

我在文末會留下一些關鍵字讓大家延伸閱讀。

GOF (四人幫是那四人,快去查R)

Creational

  • Factory Method
有四個物件,工廠抽象介面及實作類 還有 產品的抽象介面及實作類,把建構的過程切得更細。
  • Abstract Factory
產品集的概念,基本上是組合多個工廠方法。
  • Builder
每個物件的子部分個別建構複雜,統一集中建構隱藏細節 (Fluent Interface)。
  • Prototype
建立物件需耗費資源跟時間時,使用複製的方式來產生新物件。
  • Singleton
讓該物件在執行期只有唯一實例產生,但須注意執行緒安全的問題,寫法有許多種(差別是延遲生成實例或是Java可以直接使用Enum)。

Structural

  • Adapter
將目前的實現外掛上一個轉換來達到新功能,長相也像代理模式。
  • Bridge
模組之間訂好溝通的協定或是抽象介面,方便實作類的切換,像是Java JDBC。
  • Composite
數個物件之間,呈現一種樹狀結構。物件之間可以組合。
  • Decorator
傳入一個核心物件然後再為他加上額外的功能,長相很像代理模式。
  • Facade
限制外部對子模組的大量直接存取,設下一個固定入口,讓外部由此入口進入。
  • Flyweight
細瑣物件占用記憶體,設計成一起共用的概念,像是Java Sring Pool。
  • Proxy
長相類似裝飾者,還能分為下面兩種,保護代理是為控制核心物件的存取、虛代理是控制資源延時載入。

Behavioral

  • Chain of Responsility
在每個物件操作結束之後依序交後面那個物件繼續操作,像是Java Servlet Filter。
  • Command
物件來代表實際行動,命令物件可以把行動(action)及其參數封裝起來。這些行動可以被重複或取消 像是Swing Action Listener。
  • Interpreter
定義特殊語言來讓操作更加直觀。
  • Iterator
定義一個迭代器,用來遍歷資料結構,像是Java Collections裏頭十分常見。
  • Mediator
擔任多個模組之間的溝通協調中繼角色,避免各模組之間大量直接溝通造成的副作用。
  • Memento
建立物件狀態復原點,通常會搭配clone使用,讓物件做出後續操作之後,如果出錯可以回復到上個復原點。
  • Observer
物件之間的相依變化,當一個被觀察者發生變化要callback觀察者做出動作。
  • State
以策略模式為基底,加上屬性來表示物件狀態,在每次操作的過程中需要維護物件的狀態。
  • Strategy
傳入多個抽象介面並組合這些抽象介面的方法來定義演算法骨幹。
  • Template Method
用一個抽象類別來定義演算法骨幹,把許多預設實現或是留待子類別實現的方法串起來,像是Spring JDBC Template。
  • Visitor
把資料結構和邏輯分開,另外寫一個表示在資料結構內訪問主體的訪客類別,然後把處理交給這個類別來進行。

Multi-Thread Pattern

Enterprise Pattern


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

http://github.jianminhuang.cc

http://linkedin.jianminhuang.cc

http://note.jianminhuang.cc

yfr.huang@hotmail.com


上一篇
聊幾個OOAD設計原則
下一篇
例外處理!?能吃嗎 上
系列文
後端攻城獅的實戰筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言