委托工厂方法来抽象类

时间:2016-08-09 09:20:03

标签: c# design-patterns

根据Factory Method pattern,我们将对象创建委托给一个单独的类。 让我们说我有抽象的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);  
 }
}

2 个答案:

答案 0 :(得分:1)

我不确定您的实施是否属于工厂方法:

  

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

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

这里,您的CreateInstance()方法不是在具体类中派生的,而是在类层次结构的顶部获得单个实现。

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

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

答案 1 :(得分:0)

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

SRP通过A的另一个功能验证 - 这是肯定的。

当有人试图使用你的工厂创建在配置文件中定义但不是从A派生的类的实例时,我会更关心所有情况。 那当然会导致施放异常。

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

通过这样做来摆脱静态类型控制。