工厂模式的首选实现方式是什么?例如,考虑一个我想使用工厂模式保存到2个以上外部系统的网站。这是我对干净实施的第一印象:
ExternalSystemManagerFactory
ExternalSystemManager.System1
或ExternalSystemManager.System2
ExternalSystemManager
的类IExternalSystemManager
IExternalSystemManager
SaveToExternalSystem
上创建方法存根
IExternalSystemManager
(EsmSystem1
,EsmSystem2
)然后在我的客户端类中,我可以像这样保存到ExternalSystem1:
new ExternalSystemManagerFactory(ExternalSystemManager.System1).ExternalSystemManager.SaveToExternalSystem();
这看起来像是一个合理的实施吗?您是否看到此实施存在任何潜在问题?这是一种相当常见的实现方式,还是存在不同实现风格的总体趋势?
答案 0 :(得分:1)
在我看来,当涉及到模式时,它通常与它在使用时的“感觉”有关。如果您习惯以编写数据的方式访问数据,那么请务必使用它。我坚信,实际上没有一种完美的方式来实现模式,除非我的代码公然有需要并且它们自然地出现,否则我实际上会避免使用它们。所以我的建议是......不要强迫它,但如果感觉良好,那就去做吧。
答案 1 :(得分:0)
如果只有两个实现,那么您描述的方法是可以的。如果您要访问的外部系统数量增加,则必须始终更改
switch
语句。在Gang of Four描述的abstract factory pattern中,你将摆脱枚举并实现它:
此实现的一个优点是您可以轻松配置要创建的工厂,而不是在代码中使用switch语句。除此之外,每次连接新的外部系统时都不必调整switch语句,它还允许您为新系统创建实现,而无需触及工厂的组装。
如果您要创建许多依赖项,可能需要考虑的另一种方法是使用Inversion of Control Container。您在应用程序的开头注册应为接口创建的类型,并询问IOC容器是否需要实例或将其注入类的构造函数中。有几个可用的IOC容器,例如Microsoft Unity,Ninject,AutoFac,....如果您有多个或大型工厂,这将为您节省大量时间。