iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 0
0
自我挑戰組

30天認識軟體設計及架構系列 第 9

Day 9 軟體設計及架構---設計模式 - 工廠模式(Factory)

今天介紹的是工廠模式(Factory),工廠產出商品給客戶,理論上客戶並不需要知道製作的過程,最常在書上看到的例子就是一個新手村,可以訓練劍士、弓箭手、法師...等,我們不在乎訓練的方式,如果今天我要多一種盜賊,我只要跟工廠說一下就好,在程式中多一個 switch case 就能解決,下面的程式碼就是簡單工廠的例子。

class AdventureFactory{
public:
       Adventure createAdventure(int type){
             switch(type){
                    case’1’:
                           return new Warrior();
                           break;
                    case’2’
                           return new  Archer();
                           break;
             }
       }
}

大家可能有疑問說這樣有什麼好處? 一般我們要使用某個物件的時候,要先宣告那個物件,但是利用工廠模式,我們可以動態的宣告物件的類別,在程式碼執行的時候才會決定它的類別,這樣可以增加程式的靈活度,修改上也比較容易。

不過大家應該有發現,每次我要多產一種產品,我的 switch case 就要多一個,已經違反了開放封閉原則(OCP),所以如果程式需要增加、修改都會破壞原本的程式,解決方法呢就是將工廠抽象化,我們雖然不知道劍士、法師是怎麼訓練的,但是訓練過程一定不一樣,所以我們把每一種類別都變成各自的工廠,並且繼承原來的工廠,下面的程式碼應該可以看得比較清楚。

class Factory{
       virtual void training();
}

class WarriorFactory : Factory{
       void training(){...}
}

class MagicianFactory : Factory{
	   void training(){...}
}

這邊我的 Factory 宣告成 class,要用 interface 也是可以的。

用之前學的 Class Diagram 畫出來的圖看起來會是這樣。
https://ithelp.ithome.com.tw/upload/images/20191006/20111858gGfGd0infO.jpg

我們把原來的工廠抽象化之後,它就不需要知道產品產的過程,這些實作會留給子類別去實作,以上就是今天的內容,明天會再介紹其他設計模式。

參考資料:
https://blog.amowu.com/2009/08/factory-pattern.html
7天學會設計模式:設計模式也可以這樣學 -Yan(硯取歪)


上一篇
Day 8 軟體設計及架構---設計模式 - 單例模式(Singleton)
下一篇
Day 10 軟體設計及架構---設計模式 - 建構者模式(Builder)
系列文
30天認識軟體設計及架構10

尚未有邦友留言

立即登入留言