生成器与工厂方法模式

Posted

技术标签:

【中文标题】生成器与工厂方法模式【英文标题】:Builder vs Factory Method pattern 【发布时间】:2014-02-24 23:04:08 【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

构建器允许零散构建对象,例如,正在决定设置哪些字段。这可能是一个好主意,也可能不是一个好主意;这取决于业务需求。 为了更好的答案,任何人都可以看到***.com/questions/757743/… 【参考方案1】:

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

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

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

MyInterfaceType myInstance = myFactory.getTheItemOfMyInterfaceType();

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

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

希望对您有所帮助。

【讨论】:

以上是关于生成器与工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

生成对象---工厂方法模式

策略模式与简单工厂模式

4.工厂模式

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)