[Day 02] 工廠模式,策略模式,裝飾者模式


工廠模式

昨天介紹到當只有一個工廠時,所用的簡單工廠模式,但也提到一些問題:

  • 新增產品要直接修改工廠類別的程式碼 --> 違反開放/封閉原則
  • 當一個產品進行修改時,可能會影響其他產品

所以在工廠模式中進行下下列調整:

  • 工廠提升為抽象概念
  • 工廠介面只規範實體工廠類別應返回那些產品
  • 產品製作交由實體工廠實作

訓練營從原本的一座被獨立出來,弓箭手訓練營及鬥士訓練營是獨立出來的,也就是在修改弓箭手訓練流程,無需去動到鬥士,如果要新增冒險者類別就在新增一個類別,如劍士訓練營,完全不會影響抽象訓練營及現有實體訓練營,經過這樣的調整後才會符合開放/封閉原則。

抽象工廠模式

  • 用一個工廠介面來產生一系列相關的物件
  • 由實作工廠子類別來實現要建立那些物件
  • 工廠仍只是一個抽象介面
  • 但工廠非生產一種產品,而是生產一系列的產品

一個冒險者需要武器、頭盔、上衣、褲子、鞋子五種裝備,但若有四種不同的冒險者,此時則須建立20種工廠,會造成程式碼很龐大,不易維護,故靠工廠模式無法解決問題,此時將工廠定義由實體轉為抽象,抽象工廠生產一系列的裝備,而非單一的產品,則為抽象工廠模式。

小結 (各種工廠模式之比較)

  • 簡單工廠模式: 工廠直接負責生產所有產品,利用if else 或 switch case 判斷要生產的產品。
  • 工廠模式: 著重於如何生產一個物件。
  • 抽象工廠模式: 著重於產品的抽象關係,將兩個無關的產品透過抽象關係,在抽象工廠中進行生產。

策略模式

  • 將各種可互換的策略包裝成一個類別
  • 工廠模式的工廠類別並不會去使用產品,只關心如何建立物件,而策略模式的環境類別是使用外部傳入的策略類別,因此必須知道傳入策略的實際內容

冒險者訓練好後要去打怪,根據怪物種類會使用不同策略,例如說小怪物就隨便砍兩刀,強一點的怪物就要放技能之類的,在策略模式中,會由策略介面來進行規範,而各種戰鬥策略則是實體策略,使用實體策略的冒險者則為環境類別。

裝飾者模式

  • 動態的將功能附加在物件上

遊戲中冒險者可以透過各種冒險或訓練來獲取稱號,加強本身的能力,例如說"強壯的冒險者"攻擊力較強,"堅毅的冒險者"生命力較高,"炎龍的冒險者"可以讓敵人著火,剛開始會用一個冒險者介面,然後每一個稱號都是實作冒險者的子類別,然而這樣的架構在稱號越來越多時會產生非常多的子類別,現在只有三種可以選擇,所以只會有3!=6個子類別,但當有五種稱號可以選擇時,就多達5!=120種,而且還沒考慮可以取重複稱號的情況,為了避免發生建立很多子類別的狀況,所以使用裝飾者模式。首先抽象的冒險者介面裝飾者模式中就是被裝飾者,增加能利用的稱號介面就是裝飾者。

#寫作松 #設計模式
第 01 屆開發者寫作松是為期七天的活動,想要利用一周的時間來學習設計模式,正好有一本書叫做7天學會設計模式設計模式也可以這樣學,所以接下來這7天都會撰寫閱讀書摘,並且同時培養自己閱讀習慣






Related Posts

Leetcode 刷題 pattern - Topological Sort

Leetcode 刷題 pattern - Topological Sort

[22] 強制轉型 - ToBoolean、Falsy、Truthy

[22] 強制轉型 - ToBoolean、Falsy、Truthy

C++ 教學(二) 輸入輸出&基本資料型態

C++ 教學(二) 輸入輸出&基本資料型態

深入學習 LSD-SLAM - 4

深入學習 LSD-SLAM - 4

如何使用 Python 學習機器學習(Machine Learning)

如何使用 Python 學習機器學習(Machine Learning)

D3v4 工作坊 - React + D3 繪製 svg 動態路線地圖

D3v4 工作坊 - React + D3 繪製 svg 動態路線地圖



Comments