根据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);
}
}
答案 0 :(得分:1)
我不确定您的实施是否属于工厂方法:
定义用于创建对象的接口,但让子类决定 要实例化的类。 Factory方法允许类延迟 它用于子类的实例化。
(https://en.wikipedia.org/wiki/Factory_method_pattern)
这里,您的CreateInstance()
方法不是在具体类中派生的,而是在类层次结构的顶部获得单个实现。
此外,它有一个主要缺点 - 该方法是静态的。它基本上意味着每个要将生成的对象冻结到A的任意子类型的单元测试都必须在其配置文件中指定该子类型。整个测试项目中的子类型将是相同的。
使用非静态方法(仅在单独的专用Factory类中有意义),您可以更容易地处理该对象生成器的不同实现 - 例如使用存根。
答案 1 :(得分:0)
SRP通过A的另一个功能验证 - 这是肯定的。
当有人试图使用你的工厂创建在配置文件中定义但不是从A派生的类的实例时,我会更关心所有情况。 那当然会导致施放异常。
我可以很容易地想象,在一个相对较大的项目中,有几个星期或几个月后,有人会编辑这个配置文件并在那里导致一个强制转换异常。
你 通过这样做来摆脱静态类型控制。