工廠模式
昨天介紹到當只有一個工廠時,所用的簡單工廠模式,但也提到一些問題:
- 新增產品要直接修改工廠類別的程式碼 --> 違反開放/封閉原則
- 當一個產品進行修改時,可能會影響其他產品
所以在工廠模式中進行下下列調整:
- 工廠提升為抽象概念
- 工廠介面只規範實體工廠類別應返回那些產品
- 產品製作交由實體工廠實作
訓練營從原本的一座被獨立出來,弓箭手訓練營及鬥士訓練營是獨立出來的,也就是在修改弓箭手訓練流程,無需去動到鬥士,如果要新增冒險者類別就在新增一個類別,如劍士訓練營,完全不會影響抽象訓練營及現有實體訓練營,經過這樣的調整後才會符合開放/封閉原則。
抽象工廠模式
- 用一個工廠介面來產生一系列相關的物件
- 由實作工廠子類別來實現要建立那些物件
- 工廠仍只是一個抽象介面
- 但工廠非生產一種產品,而是生產一系列的產品
一個冒險者需要武器、頭盔、上衣、褲子、鞋子五種裝備,但若有四種不同的冒險者,此時則須建立20種工廠,會造成程式碼很龐大,不易維護,故靠工廠模式無法解決問題,此時將工廠定義由實體轉為抽象,抽象工廠生產一系列的裝備,而非單一的產品,則為抽象工廠模式。
小結 (各種工廠模式之比較)
- 簡單工廠模式: 工廠直接負責生產所有產品,利用if else 或 switch case 判斷要生產的產品。
- 工廠模式: 著重於如何生產一個物件。
- 抽象工廠模式: 著重於產品的抽象關係,將兩個無關的產品透過抽象關係,在抽象工廠中進行生產。
策略模式
- 將各種可互換的策略包裝成一個類別
- 工廠模式的工廠類別並不會去使用產品,只關心如何建立物件,而策略模式的環境類別是使用外部傳入的策略類別,因此必須知道傳入策略的實際內容
冒險者訓練好後要去打怪,根據怪物種類會使用不同策略,例如說小怪物就隨便砍兩刀,強一點的怪物就要放技能之類的,在策略模式中,會由策略介面來進行規範,而各種戰鬥策略則是實體策略,使用實體策略的冒險者則為環境類別。
裝飾者模式
- 動態的將功能附加在物件上
遊戲中冒險者可以透過各種冒險或訓練來獲取稱號,加強本身的能力,例如說"強壯的冒險者"攻擊力較強,"堅毅的冒險者"生命力較高,"炎龍的冒險者"可以讓敵人著火,剛開始會用一個冒險者介面,然後每一個稱號都是實作冒險者的子類別,然而這樣的架構在稱號越來越多時會產生非常多的子類別,現在只有三種可以選擇,所以只會有3!=6個子類別,但當有五種稱號可以選擇時,就多達5!=120種,而且還沒考慮可以取重複稱號的情況,為了避免發生建立很多子類別的狀況,所以使用裝飾者模式。首先抽象的冒險者介面裝飾者模式中就是被裝飾者,增加能利用的稱號介面就是裝飾者。