建造者设计模式在现实生活中有什么用途?

4

我已经阅读了相关内容,理解了其基本功能——我想知道一个常见的、真实生活中使用该模式的例子。

作为参考,我主要从事商业应用程序开发,包括 web 和 windows 平台,并使用 Microsoft 技术栈。

6个回答

5

主要应用场景:

  • 当最终结果是不可变的,但使用构造函数完成所有操作会过于复杂
  • 当我想部分构建某个东西并重复利用这个部分构建的东西,但每次都要在最后进行自定义
  • 当你开始使用工厂模式,但被工厂构建的东西有太多的组合方式

总之,建造者模式可以保持构造函数简单,同时实现不可变性。

虽然你说的是C#,但这里提供一个简单的Java示例:

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World!");
System.out.println(sb.toString());

与之相反:

String msg = "";
msg += "Hello";
msg += " ";
msg += "World!";
System.out.println(msg);

在C#中,StringBuilder的例子基本上也是一样的。 - LukeH
+1 可能是最完美的例子。除了 system.out.println(...) 之外,在 C# 中编译并且正确。 - Steven Evers

5
考虑一个行程生成器。您可以向行程添加许多东西,例如酒店、租车、航班等,每个的基数为0到*。Alice可能有一辆车和一家酒店,而Bob可能有两个航班,没有车和三家酒店。
创建具体工厂甚至抽象工厂来生成行程将非常困难。您需要一个工厂,可以在其中拥有不同的步骤,某些步骤发生,其他步骤不发生,并在创建过程的结果产生非常不同类型的对象。
通常情况下,应该从工厂开始,只有在需要更高粒度控制过程时才转向构建器。
此外,在Data & Object Factory中提供了良好的描述、代码示例和UML。

同意!在我们的软件中,我们实现了建造者模式,但基础对象是由工厂对象创建的,并且我们向其添加必要的组件。我的答案更多是一个真实世界的编码示例,但因为你从更抽象的真实世界角度看待它,所以给你点赞。 - jeremyalan

1

编辑:您会在我的评论中看到,我可能匆忙回答了这个问题,并在过程中混淆了自己。我将继续编辑此内容以适用于抽象工厂,因为我认为这是我最初的意图,但请注意,这主要是供参考,不一定是对原始问题的回应。

我见过的最常见的例子涉及GUI组件的构建方式。

例如,如果您正在为应用程序设计一个表单,其GUI组件可以采用多种表示形式(也许基于您运行的平台),则需要设计一个抽象工厂来处理这些组件的创建。

为了向表单添加新控件,代码可能如下所示:

public MyForm ()
{
    GuiFactory  factory = new Win32Factory ();
    Button      btn = factory.CreateButton ();

    btn.Text = "Go!"
    btn.Location = new Point (15, 50);

    this.Controls.Add (btn);
}

这符合抽象工厂模式,因为您可以创建不同的工厂对象实例来创建所创建对象的不同表示形式,而无需更改客户端代码(这是一个基本示例,但通常情况下,您不会使用 new 创建 Win32Factory,而是通过其他抽象获取)。


我曾经认为生成器封装了构建过程,因此在你的示例中实际的生成器将返回按钮,以便MyForm()可以调用this.Controls.Add(builder.BuildGoButton()); 作为示例。 - Chad Grant
是的,我越想越觉得当我回复时我可能有些混淆了。在考虑GUI时,我可能处于创建抽象工厂的思维模式,该工厂将根据您运行的平台创建不同的Button表示形式。 - jeremyalan

0
一个常见的例子是我们经常看到的操作系统的“sysgen”。你需要一个选择所有所需模块的过程、配置它们并返回已定制的可引导映像的过程。

0
我遇到的一个使用案例是当有多个数据源时。特定情况涉及缓存和数据库。大部分数据是从缓存中提取的,或者没有。第二个加载器查看数据以确定它是否从缓存中加载。它将查询数据库以完成填充数据。

0

有时候,为了更好地理解设计模式,可以考虑与软件无关的设计模式示例

我现在正在开发一个系统,它使用构建器来创建订单。订单是由几个其他类组成的类。我的构建器创建和验证相关类,如果所有类都有效,则创建订单类的实例。这样,我就可以确保我永远不会有缺少数据的订单实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接