工厂模式的首选实现样式

本文关键字:实现 样式 模式 工厂 | 更新日期: 2023-09-27 17:58:36

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

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

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

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

这似乎是一个合理的实施吗?您认为此实现存在任何潜在问题吗?这是一种相当常见的实现风格,还是有一种不同实现风格的普遍趋势?

工厂模式的首选实现样式

在我看来,当涉及到模式时,它通常与你使用它时的"感觉"有关。如果你能以编写数据的方式访问数据,我坚信没有完美的方法来实现一个模式,除非我的代码有明显的需求,并且它们自然而然地出现,否则我实际上会避免它们。所以我的建议是……不要强迫,但如果感觉良好,那就去做。

如果只涉及两个实现,那么您描述的方法是可以的。如果你想访问的外部系统数量增加,你总是必须更改

  • 枚举
  • 选择具体实现的构造函数中的CCD_ 11语句

在"四人帮"描述的抽象工厂模式中,你可以去掉枚举并像这样实现它:

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

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

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