C#工厂模式与泛型

时间:2017-04-19 16:40:10

标签: c# generics factory-pattern

我想为myInterface做一个工厂类,但是我无法为具体类调用构造函数,因为工厂类必须使用特定的参数T

有没有办法为通用接口创建工厂类?

简化示例

interface myInterface<T>
{
    void work(T input);
    T getSomething();
}

class A : myInterface<int>
{
    //implementation
}

class B : myInterface<someClass>
{
   //implementation
}

interface Factory<R,T>
{
     R Create(T type);
}
class myFactory<T> : Factory<myInterface<T>, string>
{
     myInterface<T> Create(string type) {
          if(type == "A")
               //return new A object
          if(type == "B")
               //return new B object
          //some default behavior
     }
}

1 个答案:

答案 0 :(得分:0)

默认情况下,工厂模式是通用的,因为此类模式的整个目的是返回不同类型的对象,具体取决于您为方法提供的值。

除了初始化所需类型的对象之外,工厂内不应该有很多代码。

在您提供的代码中,您希望返回 myInterface 类型的对象,但由于您必须指定不同的返回值,因此不太可能将通过类型参数的值选择的类型。您已经失去了工厂模式的全部要点,因为您已经声明了特定类型的工厂 - 这意味着您将只创建该类型的对象(概念丢失)。

我要做的是创建另一个类,它将作为A和B类的一个层(两个类都必须从它继承)。然后我会将工厂的返回类型声明为该类的类型。

请记住,每个类都实现相同的通用接口,但类型不同。

这是一个简短的例子:

    interface myInterface<T>
    {

    }
    class LayerClass
    {

    }
    class A : LayerClass, myInterface<int>
    {
        //implementation
    }

    class B : LayerClass, myInterface<object>
    {
       //implementation
    }

    public static void Main(string[] args)
    {

    }
    class myFactory<T>
    {
        LayerClass Create(string type) 
        {
            if(type == "A")
                return (LayerClass)new A();
            if(type == "B")
                return (LayerClass)new B();
            return null;
         }
    }