构建器与工厂方法模式

Dev*_*Dev 1 factory-method builder-pattern

我正在阅读有关构建器模式的内容,并且像往常一样我对工厂模式感到困惑。

我看过一篇很好的文章,它展示了抽象工厂和构建器模式之间的区别。

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

但我的困惑是,除了类似于抽象工厂的构建器模式之外,我觉得它还类似于工厂方法模式。不确定我的理解是否正确。但在工厂方法中,我们也使用一个单独的工厂(具体工厂中的方法)来创建一个特定的对象(而不是一系列产品)。在这种情况下,构建器与工厂方法模式有何不同。我知道 Builder 需要更多步骤来创建对象,除此之外,是否有任何特定场景需要我们使用一个而不是另一个?请指导我。

谢谢。

use*_*075 5

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

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

因此,抽象工厂和工厂方法模式是关于构建多态类型(包括当您不知道或不关心具体类型是什么时)。然而,获取该类型实例的调用通常很简单。要从工厂构建,您可能只需调用:

MyInterfaceType myInstance = myFactory.getTheItemOfMyInterfaceType();
Run Code Online (Sandbox Code Playgroud)

构建器模式更多的是构建复杂的对象,这些对象可能是也可能不是(但很可能是)已知类型。在这种情况下,您会期望进行一系列复杂的调用来构造该类型,通常会设置一个又一个参数。因为有很多已知的参数和参数,所以您通常知道将从中返回什么类型的对象(不是必须的,但它比抽象工厂更有可能)。Builder 用于构造的对象比较复杂,但不一定是多态的(它可能是多态的,但这不是模式的前提)。构建某些内容的构建器调用可能是(有关一些实际示例,请参阅 Android AlertDialog):

Builder b = new Builder();
b.setSomeValueA(myChoiceForA);
b.setSomeValueB(myChoiceForB);
MyInterfaceType myInstance = b.build();
Run Code Online (Sandbox Code Playgroud)

希望有帮助。