工厂模式的首选实现方式?

时间:2014-04-16 02:54:33

标签: c# design-patterns

工厂模式的首选实现方式是什么?例如,考虑一个我想使用工厂模式保存到2个以上外部系统的网站。这是我对干净实施的第一印象:

  • 创建一个名为ExternalSystemManagerFactory
  • 的类
  • 在此类的构造函数中传入枚举以指示目标外部系统。例如:ExternalSystemManager.System1ExternalSystemManager.System2
  • 在名为ExternalSystemManager的类IExternalSystemManager
  • 的类上创建一个属性
  • 构造函数将根据构造函数参数
  • 设置此属性值
  • 在名为IExternalSystemManager
  • SaveToExternalSystem上创建方法存根
  • 为实现IExternalSystemManagerEsmSystem1EsmSystem2
  • 的外部系统创建2个具体类

然后在我的客户端类中,我可以像这样保存到ExternalSystem1:

new ExternalSystemManagerFactory(ExternalSystemManager.System1).ExternalSystemManager.SaveToExternalSystem();

这看起来像是一个合理的实施吗?您是否看到此实施存在任何潜在问题?这是一种相当常见的实现方式,还是存在不同实现风格的总体趋势?

2 个答案:

答案 0 :(得分:1)

在我看来,当涉及到模式时,它通常与它在使用时的“感觉”有关。如果您习惯以编写数据的方式访问数据,那么请务必使用它。我坚信,实际上没有一种完美的方式来实现模式,除非我的代码公然有需要并且它们自然地出现,否则我实际上会避免使用它们。所以我的建议是......不要强迫它,但如果感觉良好,那就去做吧。

答案 1 :(得分:0)

如果只有两个实现,那么您描述的方法是可以的。如果您要访问的外部系统数量增加,则必须始终更改

  • enum
  • 构造函数中选择具体实现的switch语句。

在Gang of Four描述的abstract factory pattern中,你将摆脱枚举并实现它:

  • 工厂的抽象基类/接口。
  • 每个具体外部系统的工厂实施。
  • 您可以在代码中的一个位置创建具体工厂,并始终通过界面访问它。

此实现的一个优点是您可以轻松配置要创建的工厂,而不是在代码中使用switch语句。除此之外,每次连接新的外部系统时都不必调整switch语句,它还允许您为新系统创建实现,而无需触及工厂的组装。

如果您要创建许多依赖项,可能需要考虑的另一种方法是使用Inversion of Control Container。您在应用程序的开头注册应为接口创建的类型,并询问IOC容器是否需要实例或将其注入类的构造函数中。有几个可用的IOC容器,例如Microsoft Unity,Ninject,AutoFac,....如果您有多个或大型工厂,这将为您节省大量时间。

相关问题