所謂簡單工廠方法模式,就是為目标類建立一個工廠,當有多個目标實作的時候,在這個工廠内部進行邏輯判斷來根據條件建立不同的目标執行個體。
木質桌子:WoodenDesk
塑膠桌子:PlasticDesk
類型枚舉:Type
桌子工廠:DeskFactory
測試類:Clienter
執行結果:塑膠桌
這就是簡單工廠方法,隻有一個工廠類來面向多個目标實作。當目标實作增多時,我們不得不去修改工廠類的方法,使其相容新的實作類型,這明顯違背了開閉原則,是以出現了工廠方法模式。
工廠方法模式是對簡單工廠模式的抽象更新,将工廠這個概念抽象出來成為接口,然後針對每種目标實作類建立一個工廠實作,一對一來實作,當新增了目标實作,隻要同時新增一個工廠實作即可。
下面看看執行個體:
桌子接口:Desk
桌子工廠接口:DeskFactory
木質桌子工廠:WoodenDeskFactory
塑膠桌子工廠:
執行結果:木質桌
從上面的執行個體中可以很容易看出來,工廠方法模式的重點就在這個工廠接口了。
目标可以無限擴充,工廠類也要随之擴充,一對一存在,滿足了開閉原則,但如果目标實作較多,工廠實作類也會增多,不簡潔。
抽象工廠模式是對工廠方法模式的再更新,但是二者面對的場景稍顯差别。
工廠方法模式面對的目标一般都是單類的,就比如上面的例子,目标就是桌子這一類商品。
如果是這樣的呢:生産的是桌椅組合,目标的一套商品,每一套商品中的每類商品的種類的不同的,不同的組合形成不同的套裝。
這種情況下,就需要使用抽象工廠模式
我們還以家具為例:
椅子接口:Chair
木質椅子:WoodenChair
塑膠椅:PlasticChair
家具工廠接口:FurnitureFactory
木質家具工廠:WoodenFurnitureFactory
塑膠家具工廠:PlasticFurnitureFactory
執行結果:
可以看出二者場景的不同之處,抽象工廠模式面對的是一個組合體,如果将這一點排除的話,其他方面看起來,二者還是相似的。
這裡在目标每添加一種組合時,就需要建立一個工廠實作來對應,這一點滿足開閉原則,不會修改已有類。
但是有一種情況,會導緻修改原有類,那就是當目标需要在家具中新增一種家具類型的時候,比如例子中,家具組合中隻包含桌子和椅子,如果再添加一種書櫃,那麼所有的工廠包括工廠接口都面臨修改。
原文連結