今天介紹的是工廠模式(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://blog.amowu.com/2009/08/factory-pattern.html
7天學會設計模式:設計模式也可以這樣學 -Yan(硯取歪)