Builder vs Factory Method模式

时间:2014-02-01 03:44:42

标签: factory-method builder-pattern

我正在阅读有关Builder模式的内容,并且像往常一样,我对Factory模式感到困惑。

我看过一篇很好的文章,它展示了Abstract Factory和Builder模式之间的区别。

http://champika-nirosh.blogspot.in/2008/04/what-is-difference-between-abstract.html

但我的困惑是,与Abstract Factory类似的Builder模式我感觉它类似于Factory Method模式。不确定我的理解是否正确。但是在Factory Method中我们也使用一个单独的工厂(Concrete in Concrete Factory)来创建一个特定的对象(不是产品系列)。在那种情况下,Builder与Factory Method模式的区别。我知道Builder需要更多的步骤来创建对象,除此之外是否有任何特定的场景我们需要使用另一个?请指导我。

感谢。

1 个答案:

答案 0 :(得分:3)

您的特定使用案例将影响您可能选择的(如果有)。但基本上重申你所引用的链接上的内容:

抽象工厂和工厂方法都在创建未知类型的实例。通常这些将返回一个对应于接口的类,但您不知道(也不应该关心)具体类型是什么。要使用该链接中的图片,它使用的是WindowsFactory,这意味着抽象工厂正在返回与Windows兼容的实例。如果您的工厂是LinuxFactory,那么您可能会得到一个适用于Linux的对象。另请注意,您可能不知道您是否拥有LinuxFactory或WindowsFactory,只是您拥有特定类型的Factory。

所以抽象工厂&工厂方法模式是关于构建多态类型(包括当你不知道或关心具体类型将是什么时)。但是,获取该类型实例的调用通常是微不足道的。要从工厂建造,你可能只是打电话:

MyInterfaceType myInstance = myFactory.getTheItemOfMyInterfaceType();

构建器模式更多地是关于构建可能是也可能不是(但可能是)已知类型的复杂对象。在这种情况下,您需要一系列复杂的调用来构造类型,通常会设置一个接一个的参数。因为有很多已知的参数和参数,所以你通常知道你将从中获取什么类型的对象(不必,但它比抽象工厂更可能)。构造对象时使用的构建器很复杂,但不一定是多态的(它可能是多态的,但这不是模式的前提)。构建某些东西的构建器调用可能是(请参阅Android AlertDialog以获取一些实际示例):

Builder b = new Builder();
b.setSomeValueA(myChoiceForA);
b.setSomeValueB(myChoiceForB);
MyInterfaceType myInstance = b.build();

希望有所帮助。