Builder设计模式和Factory设计模式之间的区别是什么?

哪一种更有利?为什么?

如果我想测试和比较/对比这些模式,我如何将我的发现表示为图表?


当前回答

许多设计从使用工厂方法开始(不太复杂,通过子类更可定制),并向抽象工厂、原型或生成器(更灵活,但更复杂)发展。

Builder专注于逐步构建复杂对象。

实施:

明确定义构建所有可用产品表示的通用构建步骤。否则,您将无法继续实现该模式。在基本生成器接口中声明这些步骤。为每个产品表示创建一个具体的生成器类,并实现它们的构造步骤。

抽象工厂专门创建相关对象的族。Abstract Factory会立即返回产品,而Builder允许您在获取产品之前运行一些额外的构建步骤。

您可以将抽象工厂与Bridge一起使用。当Bridge定义的某些抽象只能用于特定实现时,这种配对非常有用。在这种情况下,抽象工厂可以封装这些关系,并从客户端代码中隐藏复杂性。

深入设计模式

其他回答

两者都是创造模式,以创建对象。

1) 工厂模式-假设您有一个超级类和N个子类。对象的创建取决于传递的参数/值。

2) 生成器模式-创建复杂对象。

Ex: Make a Loan Object. Loan could be house loan, car loan ,
    education loan ..etc. Each loan will have different interest rate, amount ,  
    duration ...etc. Finally a complex object created through step by step process.

这两种模式都有相同的必要性:对某些客户端代码隐藏复杂对象的构造逻辑。但是,是什么使一个对象变得“复杂”(或有时变得复杂)?主要是由于依赖关系,或者更确切地说是由更多部分状态组成的对象的状态。您可以通过构造函数注入依赖项来设置初始对象状态,但一个对象可能需要很多依赖项,其中一些依赖项将处于默认初始状态(只是因为我们应该了解到,将默认依赖项设置为null不是最干净的方式),而另一些依赖项则设置为由某种条件驱动的状态。此外,有些对象财产是某种“不经意的依赖关系”,但它们也可以假定为可选状态。

有两种众所周知的方法来控制这种复杂性:

组合/聚合:构造一个对象,构造其依赖对象,然后连接在一起。在这里,构建器可以使确定引导组件构建的规则的过程透明而灵活。多态性:构造规则直接声明到子类型定义中,因此每个子类型都有一组规则,某些条件决定了这些规则中的哪一个适用于构造对象。工厂完全适合这种情况。

没有什么可以阻止这两种方法的混合。一个产品系列可以抽象对象创建,由生成器完成,生成器可以使用工厂来确定实例化哪个组件对象。

Builder Factory
Return only single instance to handle complex object construction Return various instances on multiple constructors
No interface required Interface driven
Inner classes is involved (to avoid telescopic constructors) Subclasses are involved

伸缩构造器模式

类比:

工厂:考虑一家餐馆。创建“今天的饭”是一种工厂模式,因为你告诉厨房“给我今天的饭吃”,厨房(工厂)根据隐藏的标准决定生成什么对象。生成器:如果您订购自定义披萨,则会显示生成器。在这种情况下,服务员告诉厨师(构建者)“我需要一个比萨饼;在其中添加奶酪、洋葱和培根!”因此,构建者公开了生成对象应该具有的属性,但隐藏了如何设置这些属性。

礼貌

IMHO

Builder是某种更复杂的工厂。

但在Builder中,您可以使用另一个工厂来实例化对象,这是构建最终有效对象所必需的。

所以,谈论“创造性模式”的复杂性演变,你可以这样想:

Dependency Injection Container -> Service Locator -> Builder -> Factory

构建模式强调创建对象的复杂性(通过“步骤”解决)

抽象模式强调(多个但相关的)对象的“抽象”。