优选的工厂方法实施

时间:2013-08-21 12:40:24

标签: design-patterns

我可以通过以下方式实现Factory方法: 方法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;

    }
}

方法2:

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

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

    }

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

2 个答案:

答案 0 :(得分:1)

如果你遵循第一种方法,那么如果你将来需要创建一个新类型,比方说A3,那么你需要修改GetInstance方法来编写创建A3的代码。这违反了Open/closed Principle -

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();
    }
}

这样您就不需要修改现有代码了。

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

答案 1 :(得分:0)

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

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

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