34

似乎这是一个骗局,但请耐心等待 - 我保证我已经阅读了相关的帖子(和GOF 书)。

在我阅读完所有内容之后,我仍然不清楚何时使用抽象工厂、工厂方法或构建器。我相信,在我看到一个问题的简单示例后,它最终会深入人心,这个问题最好由构建者解决,而使用抽象工厂显然是愚蠢的。

你能提供一个简单的例子,你会清楚地使用一种模式而不是其他模式吗?

我知道如果这个例子太简单,它可能归结为一个意见问题,但我希望如果有人可以,那个人就是这样。

谢谢。

4

6 回答 6

55

构建器可帮助您构建复杂的对象。一个例子是StringBuilder类(JavaC#),它一块一块地构建最终的字符串。一个更好的例子是 Spring 中的UriComponentsBuilder,它可以帮助您构建 URI。

工厂方法一次性为您提供了一个完整的对象(与构建器相反)。基类定义了一个返回接口(或超类)引用的抽象方法,并将对象的具体创建推迟到子类。

抽象工厂是创建许多不同相关对象的接口(或抽象类)。一个很好的例子(在 .NET 中)是DbProviderFactory类,它用于创建与给定数据库提供程序(oracle、sql server 等)相关的对象(连接、命令等),具体取决于其具体实现。

于 2010-09-10T18:36:15.667 回答
9

建造者

// Builder encapsulates construction of other object. Building of the object can be done in multiple steps (methods)
public class ConfigurationBuilder
{
  // Each method adds some configuration part to internally created Configuration object
  void AddDbConfiguration(...);
  void AddSmtpConfiguration(...);
  void AddWebServicesConfiguration(...);
  void AddWebServerConfiguration(...);

  // Returns built configuration
  Configuration GetConfiguration();
}

工厂方法

// Factory method is declared in base class or interface. Subclass defines what type is created by factory method.
public interface ICacheProvider
{
  ISession CreateCache(); // Don't have to return new instance each time - such decission is part of implementation in derived class.
}

public class InMemoryCacheProvider : ICacheProvider
{ ... }

public class DbStoredCacheProvider : ICacheProvider
{ ... }

// Client code
ICacheProvider provider = new InMemoryCacheProvider
ICache cache = provider.CreateCache(); 

抽象工厂

// Abstract factory defines families of platform classes - you don't need to specify each platform class on the client.
public interface IDbPlatform
{
  // It basically defines many factory methods for related classes
  IDbConnection CreateConnection();
  IDbCommand CreateCommand();
  ...
}

// Abstract factory implementation - single class defines whole platform
public class OraclePlatfrom : IDbPlatform
{ ... }

public class MySqlPlatform : IDbPlatform
{ ... }

// Client code:
IDbPlatform platform = new OraclePlatform();
IConnection connection = platform.CreateConnection(); // Automatically Oracle related
...
于 2010-09-10T19:16:22.543 回答
2

抽象工厂、工厂方法、构建器:所有这些模式都是创建模式,它们是处理对象创建机制的设计模式,试图以适合情况的方式创建对象。

工厂方法:

  1. 它定义了一个用于创建对象的接口,但让子类决定实例化哪个类
  2. 我们在不向客户端公开创建逻辑的情况下创建对象,并使用通用接口(或抽象类)引用新创建的对象
  3. 通过消除将特定于应用程序的类绑定到代码中的需要来提供松散耦合。代码只与接口或抽象类交互
  4. 它可以使用继承或子类来达到目的

    重点说明:您将创建一个接口和这些接口的特定实现。在工厂方法中,根据条件,您将获得通用接口的具体实现。

抽象工厂:

  1. 提供用于创建相关或依赖对象系列的接口,而无需指定它们的具体类
  2. 封装的层次结构:许多可能的“平台”`,以及一套“产品”的构建
  3. 抽象工厂类通常使用工厂方法实现,但也可以使用原型实现

生成器:

  1. 构建器模式使用简单对象并使用逐步方法构建复杂对象
  2. 在这种情况下替换为工厂方法/抽象工厂:从客户端程序传递到工厂类的参数过多,容易出错
  3. 某些参数可能是可选的,不像 Factory 中强制发送所有参数

Java Builder 设计模式指南

  1. 在类中创建一个名为 Builder 的静态嵌套类,其对象将由 Builder 构建
  2. 生成器类将具有与原始类完全相同的字段集
  3. Builder 类将公开添加成分的方法。每个方法都将返回相同的 Builder 对象。每个方法调用都会丰富构建器。
  4. Builder.build() 方法将所有构建器字段值复制到实际类中并返回 Item 类的对象
  5. Item 类(我们为其创建 Builder 的类)应该有私有构造函数来从 build() 方法创建它的对象,并防止外人访问它的构造函数。

相关文章:

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

将构建器保持在单独的类中(流利的界面)

有用的链接:

采购设计模式

于 2016-02-20T11:02:01.790 回答
0

抽象工厂模式使用(工厂的)子类化来生成其他对象(非工厂)。抽象工厂还设想生成的对象属于并行层次结构(例如,为了处理平台独立性,每个平台一个层次结构)。

Builder 模式使用子类化来产生“输出”——它根本不一定是对象。GOF 示例使生成器生成文本输出(标记或其他)。

工厂方法模式与其他两种模式不同,它将“创建者”划分为抽象和具体的实现(因此强调它属于框架实现)。像抽象工厂一样,它处理制作实际对象。

这三个都非常相似,因为它们都使用子类化。正是子类化是它们的突出品质,它隐藏了细微的差异(如上所述),因此许多人很难看到差异。

于 2010-09-10T18:45:57.203 回答
0

抽象工厂对于测试驱动开发和减少耦合特别有帮助。

例如,在 C# 中:

public class Worker
{
    public IConsumerFactory Factory { get; set; }

    private IResource resource;

    public DoWork()
    {
        IConsumer consumer = Factory.CreateConsumer();
        consumer.Consume(resource);
    }
}

public interface IConsumerFactory
{
    IConsumer CreateConsumer();
}

public interface IConsumer
{
    void Consume(IResource resource);
}

public class DefaultConsumerFactory : IConsumerFactory
{
    public IConsumer CreateConsumer()
    {
        return new DefaultConsumer();
    }
}

public class DefaultConsumer : IConsumer
{
    public void Consume(IResource resource)
    {
      ... Do Work ...
    }
}

这样,您可以使用依赖注入来注入生产代码的默认实现,然后您可以轻松地模拟工厂及其创建的对象。

于 2010-09-10T18:56:26.130 回答
0
  • 工厂方法模式 - 当您想要构建复杂对象系列时。
  • 对象构建器模式 - 当您希望允许用户将他们的自定义实现插入到您的框架中时

请访问以下网址了解更多详情。

http://xeon2k.wordpress.com

于 2010-11-27T05:42:56.193 回答