什么时候使用工厂模式而不是重载的构造函数来实例化对象更有意义?

时间:2009-10-09 00:46:25

标签: design-patterns overloading factory instantiation constructor

在Karl Seguin的Foundations of Programming中,有一小部分关于使用工厂模式。他通过声明“你可以使用构造函数重载完成相同的功能”来关闭段落,但是没有说明何时或为什么?

那么,何时使用工厂模式而不是重载的构造函数来实例化对象更有意义呢?

7 个答案:

答案 0 :(得分:4)

如果你想要更松散的耦合,那么工厂更有意义,因为你可以调用汽车工厂,传入suv enum,然后返回正确的类。您的应用程序并不关心实际返回哪个类,只要它满足您的需求。

答案 1 :(得分:4)

如果您正在执行Dependency Injection但需要在依赖项中根据需要创建依赖项的实例,则可以选择将一个接口注入类工厂。工厂可以返回接口或抽象类。这提供了灵活性,可测试性和解耦,但代价是复杂性。

答案 2 :(得分:2)

当我希望工厂构建几个不同的可能子类之一时,我使用工厂(我希望调用者知道基类但不知道子类)。


另外,当不同的静态方法采用相同的参数类型时,我偶尔也会使用类的静态方法而不是重载的构造函数(因此构造函数不能仅基于参数类型重载)。这是一个人为的例子:

Department
{
  //static factory methods
  public static Department createFromBoss(string bossName) { ... }
  public static Department createFromLocation(string locationName) { ... }
}

答案 3 :(得分:1)

我不同意他的说法。当您使用不同的构造/初始化构造函数的方法时,将使用不同的构造函数。工厂模式用于初始化标准导致您有不同的对象构建。

答案 4 :(得分:0)

我有一个工厂有用的情况。我必须实例化一个视频效果才能在视频上运行。根据视频的类型,视频效果具有不同的具体类别。

如果我实例化具体类,那么我将失去在以后添加更多视频效果而无需修改实例化代码的能力。

当我添加更多视频效果时,我只需要修改工厂以选择合适的具体类别。

这有意义吗?

答案 5 :(得分:0)

工厂有时可能会生成返回类型的子类型。您无法使用构造函数执行此操作,但可以灵活地使用工厂。

答案 6 :(得分:0)

如果你想通过你的方法实现多态,那么使用工厂模式来使用子类也更有意义,如ChrisW所示。如果

Department b = Department.createFromBoss();
Department l = Department.createFromLocation();

然后返回Department的不同子类,

b.Close()

l.Close()
例如,

可能会采取不同的操作,如果您必须通过构造函数重载尝试Close()单个对象,那将会更加混乱。