0

我可以通过以下方式实现工厂方法: 方法 1:

  class A
  {

  }
  class A1:A
  {

  }

  class A2:A
  {

  }
static class Factory
{
    public static A GetInstance(int i)
    {
        if (i == 1)
            return new A1();
        else if (i == 2)
            return new A2();
        else
            return null;

    }
}

方法二:

class Factory
    {
         abstract A CreateA();
    }
    class Factory1 : Factory
    {
        public A CreateA()
        {
            return new A1();
        }
    }

    class Factory2 : Factory
    {
        public A CreateA()
        {
            return new A1();
        }

    }

哪种方法更好?这些方法的优点/缺点是什么?请让我知道最好的方法。

4

2 回答 2

1

如果您遵循第一种方法,那么如果您将来需要创建一个新类型,比如说,,A3那么您需要修改GetInstance方法来编写创建代码A3。这违反了开放/封闭原则-

public static A GetInstance(int i)
{
    if (i == 1)
        return new A1();
    else if (i == 2)
        return new A2();

    // modification
    else if (i == 3)
        return new A3();

    else
        return null;

}

如果您遵循第二种方法,那么您将不需要修改现有代码。您可以通过以下方式轻松合并新类型 -

class Factory3 : Factory
{
    public A CreateA()
    {
        return new A3();
    }
}

这样您就无需修改现有代码。

选择您认为适合您的用例的任何一个。

于 2013-08-21T12:43:42.213 回答
0

没有更好的方法。它们服务于不同的目的。

第一个使用参数来决定返回哪个适当的子类实例。调用者不知道(也不关心)子类。他有一个 int,并且想要这个 int 的适当 A。

第二个只是构造函数的替代品,但强制调用者已经知道他想要实例化哪个子类,并选择合适的工厂。

于 2013-08-21T12:49:04.703 回答