【问题标题】:What is a real-life use for the builder design pattern?构建器设计模式的实际用途是什么?
【发布时间】:2014-02-08 13:32:09
【问题描述】:

我已经阅读过它,我了解它的基本功能——我想知道这个模式在现实生活中的常见用法示例。

作为参考,我主要使用 Microsoft 堆栈处理业务应用程序、Web 和 Windows。

【问题讨论】:

    标签: c# design-patterns architecture


    【解决方案1】:

    想一想行程制定者。您可以在行程中添加很多东西,例如酒店、租车、航空公司航班,每个的基数都是 0 到 *。 Alice 可能有汽车和酒店,而 Bob 可能有两个航班,没有汽车和三个酒店。

    创建一个具体的工厂甚至是抽象的工厂来吐出一个行程是非常困难的。您需要的是一个工厂,您可以在其中执行不同的步骤,某些步骤会发生,而其他步骤则不会,并且通常会作为创建过程的结果产生非常不同类型的对象。

    一般来说,你应该从工厂开始,只有当你需要对过程进行更高的粒度控制时才去建造者。

    另外,Data & Object Factory 有很好的描述、代码示例和 UML。

    【讨论】:

    • 同意!在我们的软件中,我们实现了构建器模式,但是基础对象是作为工厂对象的结果创建的,并且我们向其添加了必要的组件。我的回答更像是一个真实世界的编码示例,但 +1 是为了从更抽象的现实世界的角度看待它。
    【解决方案2】:

    关键用例:

    • 当最终结果是不可变的,但 用构造函数完成这一切 太复杂了
    • 当我想部分构建时 一些东西并部分重用 构建的东西,但自定义它 每次都结束
    • 当您从工厂模式开始,但正在构建的东西 工厂的排列太多

    总而言之,builder 使您的构造函数保持简单,但允许不变性。

    您说的是 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);
    

    【讨论】:

    • StringBuilder 示例在 C# 中也几乎相同。
    • +1 也许是最完美的例子。除了 system.out.println(...) 之外,它还可以在 C# 中编译并且是正确的。
    【解决方案3】:

    编辑:您会在我的 cmets 中看到我可能已经匆忙回答这个问题,并且在此过程中让自己感到困惑。我将继续编辑它以与抽象工厂一起使用,就像我最初打算的那样,但请注意,这主要是为了参考,不一定是对原始问题的回应。

    我见过的最常见的例子是关于如何构建 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);
    }
    

    这满足了抽象工厂模式,因为您可以创建工厂对象的不同实例来创建所创建对象的不同表示,而无需更改客户端代码(这是一个基本示例,但我认为通常您不会创建 Win32Factory使用 new 时,它将通过其他一些抽象获得)。

    【讨论】:

    • 我的印象是构建器封装了建筑物,因此实际的构建器会在您的示例中返回按钮,以便 MyForm() 会调用 this.Controls.Add(builder.BuildGoButton()) ;例如。
    • 是的,我想得越多,我想当我离开回复时,我的思路就被交叉了。在考虑 GUI 时,我可能处于抽象工厂的心态,它会根据您运行的平台创建不同的 Button 表示。
    【解决方案4】:

    我们经常看到的一个常见示例是操作系统的“sysgen”。你有一个进程选择了你需要的所有模块,配置它们,并返回一个已定制的可启动映像。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        有时想一想non-software related example of design patterns 有助于理解它们。

        我现在正在开发一个使用构建器创建订单的系统。订单是一个由其他几个类组成的类。我的构建器创建并验证关联的类,如果所有类都有效,则创建订单类的实例。通过这种方式,我可以确定我永远不会有缺少数据的订单实例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-02
          • 2019-05-17
          • 2015-04-22
          • 2021-07-22
          • 1970-01-01
          • 2011-09-20
          • 2015-06-07
          相关资源
          最近更新 更多