在接口或产品类的抽象超类中定义工厂方法

问题描述:

我有一个抽象的超类和继承自它的子类。在接口或产品类的抽象超类中定义工厂方法

每个子类MySubclass应该有一个public static MySubclass CreateFrom(ISomething something)工厂方法。其参数的接口对于所有子类都是相同的,但返回类型必须始终是相应子类的类型。

我可以以某种方式实现此目的,在接口或抽象超类方法定义之后具有静态工厂方法,而无需为每个单独的子类创建单独的静态工厂类?

如果ISomething是始终不变的(或至少一个共同的)类型,你可以做的了CreateFrom方法超类泛型并用参数调用继承类的构造函数。只要确保所有的继承类都具有该构造函数(不确定,但我认为没有办法'强制'构造函数模式)。

public abstract class SuperClass 
{ 
    public static T CreateFrom(ISomething something) 
    { 
     return (T)Activator.CreateInstance(typeof(T), something); 
    } 
} 

public class InheritedClass : SuperClass 
{ 
    public InheritedClass(ISomething something) 
    {} 
} 

这样你就可以通过调用

SuperClass.CreateFrom<InheritedClass>(something); 

创建实例或拆分创建和初始化:

public abstract class SuperClass 
{ 
    protected abstract void Initialize(ISomething something); 

    public static T CreateFrom(ISomething something) where T : new() 
    { 
     T result = new T(); 
     T.Initialize(something); 
    } 
} 

public class InheritedClass : SuperClass 
{ 
    public InheritedClass() 
    {} 

    protected override Initialize(ISomething something) 
    {} 
} 

您不能在接口上定义静态成员,因为静态成员属于某个类。但我无法想象有这样一个理由。你应该问自己为什么你需要这样的功能。一个子类是否真的需要实例化,或者是否可以轻松地使用另一个独立的(工厂)类?

只需创建一个简单的工厂类,其中包含指示要创建的通用参数。

class Factory<T> where T: new() 
{ 
    T CreateFrom(ISomething param) 
    { 
     return new T(); 
    } 

} 

现在,你可以简单地调用它是这样的:

var myFactory = new Factory<MyClass>(); 
myFactory.CreateFrom(mySomething); 
+0

但不是静态的...... – buffjape

+1

然而,这将需要一个子类的实例,因为CreateFrom方法不是静态的。我想这正是他想要避免的。 –

我使出在similiar样的要求,不同的解决方案。在我的超正好是一个抽象我需要创建类的实例,用它做的东西,所以我做了以下技巧:

public abstract class Element 
{ 
    protected virtual void copyFrom(Element other) 
    { 
    } 

    protected abstract Elememt newInstanceOfMyType(); 
    public object clone() 
    { 
     var instance= newInstanceOfMyType(); 
     instance.copyFrom(this); 
     return instance;   
    } 
} 

现在我所有的子类从元素类继承覆盖newInstanceOfMyType方法所需放弃其类型的实例,然后重写copyFrom方法以生成完美的克隆。现在人们可能会争辩说为什么抽象克隆方法不能做同样的工作?是的,它可以。但我需要克隆的子类实例以及一个空实例(不需要从当前的任何拷贝),所以我想出了这个架构。