2013-05-06 72 views
0

我有一個關於國際奧委會,工廠和開放/封閉原則的問題。國際奧委會,班級工廠,開放/關閉

考慮,如果你願意,以下工廠

public function PODocument(_type as string) as IPODocument 

     dim d as new PODocument 
     if _type = "service" then 
     d.header = new ServicePOHeader() 
     d.details = new ServicePOLineItems() 
     else if _type = "merchandise" then 
     d.header = new MerchandisePOHeader() 
     d.details = new MerchandisePOLineItems() 
     end if 

    return d 

end function 

這是爲我工作,我可以很好地具有約異類收藏網頁顯示的信息。

我的挑戰是,今天有人告訴我有時某個客戶會一起訂購服務和商品。來吧,我們中間誰能看到那個來?

因此,我編寫了一套新的提供程序來處理增加的複雜性,更改了工廠以包括新類型的案例,我退出並運行。

但是,我違反了開放/關閉的原則,通過更改工廠,它已發佈到生產。 有沒有辦法設置這個,以免我經常更換工廠?

在此先感謝。

+0

你不應該擔心這些,這些原則並不意味着遵循教條,你的設計很好。 – 2013-05-06 04:00:01

回答

1

是的。你的情況最簡單的例子是爲每個_type定義一個工廠類,並將它們命名爲ServiceFactoryMerchandiseFactory等,或者在其上放置<PODocumentType("Service")>等。

然後找到所有工廠(例如使用反射),將它們放在Dictionary(Of String, IPODocumentFactory)中,然後根據鍵選擇正確的工廠。

在更復雜的情況下,IPODocumentFactory接口可能包括CanCreate()方法以及Create()。然後,您可以根據其對當前情況的看法在列表中選擇一個工廠。

請注意,發現和列表解析支持通常由DI框架(如Unity或Autofac)提供。

+0

謝謝安迪,這些都是有用的設計建議。我可能需要扣減並調查DI框架。我一直在避免像瘟疫一樣。在你提到的2中,你有偏好嗎? – greg 2013-05-07 14:24:08

+0

當我有選擇時,我總是使用Autofac。我前段時間對IoC框架進行了一些比較,似乎是功能上最好的。如果您不介意直接參考Autofac,則它提供了一個開箱即用的模塊系統。 – 2013-05-07 14:51:33

相關問題