我可以通过以下方式实现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();
}
}
哪种方法更好? 这些方法有哪些优点/缺点? 请让我知道最好的方法。
答案 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,并选择合适的工厂。