2009-05-03 97 views

回答

5

想到一个行程生成器。有很多东西可以添加到您行程如旅馆,租车,航空公司航班和每个的基数是0到*。爱丽丝可能会有汽车和酒店,而鲍勃可能有两个航班,没有汽车和三家酒店。

要创建一个混凝土工厂甚至抽象工厂来吐出一个行程是非常困难的。您需要的是一个工厂,您可以采取不同的步骤,某些步骤发生,其他步骤不会发生,并且通常会因创建过程而产生非常不同类型的对象。

一般来说,只有在需要更高的粮食控制权的情况下,您才应该从工厂开始,然后转到建设者处。

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

+0

同意!在我们的软件中,我们实现了构建器模式,但是基础对象是作为Factory对象的结果创建的,我们添加了必要的组件。 我的答案更多地是一个真实世界的编码示例,但是从更抽象的真实世界的角度来看+1。 – jeremyalan 2009-05-03 03:16:29

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,它会通过其他抽象获得)。

+0

我的印象是构建器封装了建筑物,所以实际的构建器会返回你的例子中的按钮,这样MyForm()会调用this.Controls.Add(builder.BuildGoButton());例如。 – 2009-05-03 04:27:10

+0

是的,我越想越想,当我离开我的回应时,我想我的电线越过了。在考虑GUI时,我可能是在抽象工厂的思维背景下创建Button的不同表示,具体取决于您在哪个平台上运行。 – jeremyalan 2009-05-04 16:45:19

0

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

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); 
0

一个用途,我已经遇到具有多个数据源时的情况。具体情况涉及缓存和数据库。大部分数据都是从缓存中提取的,或者不是。第二个加载器查看数据以查看它是否从缓存中加载。它会查询数据库完成填充数据。

0

有时,想想non-software related example of design patterns以便了解它们会有所帮助。

我有一个系统,我现在正在使用一个构建器来创建一个订单。该订单是由其他几个类组成的类。我的构建器创建并验证关联的类,如果全部有效,则创建订单类的实例。这样我可以确定,我从来没有缺少数据的订单实例。