我对IOC,工厂和开放/封闭原则有疑问。
如果愿意,请考虑以下工厂
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 :(得分:1)
是。对于您的案例,最简单的示例是为每个_type
定义工厂类,并将它们命名为ServiceFactory
,MerchandiseFactory
等,或者在其上添加<PODocumentType("Service")>
等。
然后找到所有工厂(例如,使用反射),将它们放在Dictionary(Of String, IPODocumentFactory)
中,并根据键选择正确的工厂。
在更复杂的情况下,除了IPODocumentFactory
之外,CanCreate()
界面可能还包含Create()
方法。然后,您可以根据其对当前情况的看法选择列表中的工厂。
请注意,发现和列表解析支持通常由DI框架(例如Unity或Autofac)提供。