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

哪一种更有利?为什么?

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


当前回答

生成器模式和工厂模式看起来都很像肉眼,因为它们都为您创建对象。

但你需要仔细观察

这个现实生活中的例子将使两者之间的区别更加明显。

假设你去了一家快餐店,点了食物。

1) 什么食物?

披萨

2) 什么浇头?

辣椒,番茄,烤鸡,无菠萝

因此,不同种类的食物是通过工厂模式制作的,但特定食物的不同变体(口味)是通过构建模式制作的。

不同种类的食物

披萨、汉堡、意大利面

披萨的变体

只有奶酪、奶酪+番茄+辣椒、奶酪+西红柿等。

代码示例

您可以在这里看到这两种模式的示例代码实现生成器模式工厂模式

其他回答

工厂只是一个围绕构造函数(可能是不同类中的一个)的包装函数。关键区别在于,工厂方法模式要求在单个方法调用中构建整个对象,所有参数都在一行中传递。将返回最终对象。

另一方面,构建器模式本质上是一个包装器对象,它围绕着您可能希望传递到构造函数调用中的所有可能参数。这允许您使用setter方法来缓慢地建立参数列表。生成器类上的另一个方法是build()方法,它简单地将生成器对象传递到所需的构造函数中,并返回结果。

在像Java这样的静态语言中,当您有多个(可能是可选的)参数时,这就变得更加重要,因为它避免了对所有可能的参数组合使用伸缩构造函数的要求。此外,生成器允许您使用setter方法来定义在调用构造函数后不能直接修改的只读或私有字段。

基本工厂示例

// Factory
static class FruitFactory {
    static Fruit create(name, color, firmness) {
        // Additional logic
        return new Fruit(name, color, firmness);
    }
}

// Usage
Fruit fruit = FruitFactory.create("apple", "red", "crunchy");

基本生成器示例

// Builder
class FruitBuilder {
    String name, color, firmness;
    FruitBuilder setName(name)         { this.name     = name;     return this; }
    FruitBuilder setColor(color)       { this.color    = color;    return this; }
    FruitBuilder setFirmness(firmness) { this.firmness = firmness; return this; }
    Fruit build() {
        return new Fruit(this); // Pass in the builder
    }
}

// Usage
Fruit fruit = new FruitBuilder()
        .setName("apple")
        .setColor("red")
        .setFirmness("crunchy")
        .build();

比较这两个维基百科页面的代码样本可能是值得的:

http://en.wikipedia.org/wiki/Factory_method_patternhttp://en.wikipedia.org/wiki/Builder_pattern

我相信,当您处理相同的代码库和不断变化的需求时,在一定的时间段内,Factory&Builder模式的用法和它们之间的区别可以更容易理解/澄清。

根据我的经验,通常从Factory模式开始,包括两个静态创建者方法,主要隐藏相对复杂的初始化逻辑。随着对象层次结构变得越来越复杂(或添加更多类型、参数),您可能最终会使用更多参数填充方法,更不用说您必须重新编译Factory模块。所有这些都会增加创建者方法的复杂性,降低可读性,并使创建模块更加脆弱。

该点可能是过渡/延伸点。通过这样做,您可以围绕构造参数创建一个包装器模块,然后您可以通过添加更多抽象(可能)和实现来表示新的(类似的)对象,而无需接触实际的创建逻辑。所以你有了“不那么复杂”的逻辑。

坦率地说,提到某种“一步或多步创建一个对象是不同的”,因为唯一的多样性因素不足以让我区分它们,因为我可以对我目前面临的几乎所有情况都使用这两种方法,而没有任何益处。这就是我最后想到的。

工厂:用于创建对象的实例,其中对象的依赖项完全由工厂保存。对于抽象工厂模式,通常有许多相同抽象工厂的具体实现。工厂的正确实现是通过依赖注入注入的。

生成器:用于构建不可变对象,当要实例化的对象的依赖项部分是预先知道的,部分是由生成器的客户端提供的。

生成器和抽象工厂有着不同的目的。根据正确的用例,您必须选择合适的设计模式。

生成器的显著特点:

生成器模式使用简单对象和分步方法构建复杂对象生成器类逐步构建最终对象。此生成器独立于其他对象在这种情况下替换为Factory方法/抽象工厂:从客户端程序传递给Factory类的参数太多,容易出错某些参数可能是可选的,不像工厂中强制发送所有参数

工厂(简单工厂)的显著特点:

创建型模式基于继承Factory返回一个Factory方法(接口),然后返回具体对象您可以用新的具体对象替换接口,客户端(调用者)不应该知道所有具体实现客户端始终只访问接口,您可以在Factory方法中隐藏对象创建详细信息。

通常,设计从使用工厂方法(不那么复杂,更可定制,子类激增)开始,并向抽象工厂、原型或生成器(更灵活,更复杂)发展

查看相关帖子:

将生成器保持在单独的类中(流畅的接口)

设计模式:工厂vs工厂方法vs抽象工厂

有关详细信息,请参阅以下文章:

资源制造

日志记录设备

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

伸缩构造器模式

类比:

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

礼貌