将工厂方法委托给抽象类

本文关键字:抽象类 工厂 方法 | 更新日期: 2023-09-27 18:01:40

根据工厂方法模式,我们将对象创建委托给一个单独的类。假设我有抽象类A和一些实现者。实现是从带反射的配置文件中加载的,因此我们仍然使用类型A进行操作。我想知道在抽象类中创建静态创建方法是否有任何问题。任何评论?这样做的好处是不需要额外的类。你可能会争辩说,除了主要功能之外,它还有创建子类型对象的责任——这真的违反了SOLID的S原则吗?

public abstract class A
{
 // Some abstract stuff
 public static A CreateInstance()
 {
   Type type = GetTypeFromConfig(); // pseudo method
   return (A)Activator.CreateInstance(type);  
 }
}

将工厂方法委托给抽象类

我不确定你的实现是否属于工厂方法:

定义用于创建对象的接口,但让子类来决定要实例化哪个类。Factory方法允许类延迟

(https://en.wikipedia.org/wiki/Factory_method_pattern)

这里,你的CreateInstance()方法不是在具体类中派生的,它在类层次结构的顶部得到一个单独的实现。

此外,它有一个主要缺点——该方法是静态的。这基本上意味着每个想要将生成的对象冻结为A的任意子类型的单元测试都必须在其配置文件中指定该子类型。并且子类型在整个测试项目中是相同的。

使用非静态方法(仅在单独的专用Factory类中有意义),可以更容易地处理该对象生成器的不同实现,例如使用存根。

编辑:是的,现在代码更清楚了。

SRP是用A的另一个函数验证的——这是肯定的。

更重要的是,我会关注所有的情况下,当有人试图使用你的工厂来创建类的实例定义在配置文件中,但不是从A派生。这当然会导致强制转换异常。

我可以很容易地想象,在一个相对较大的项目中,几个星期或几个月后,有人会编辑这个配置文件,并在那里引起强制转换异常。

你的有点像通过这样做摆脱了静态类型控制