似乎这是一个问题,但请忍受我 - 我保证我已经阅读了相关帖子(以及 GOF书).

在阅读了所有内容之后,我仍然没有清楚什么时候使用抽象工厂,工厂方法或建筑商。我相信,在我看到一个简单的问题示例之后,它最终会陷入困境,例如 建筑商 例如,使用一个显然很愚蠢 抽象工厂.

您能提供一个简单的示例,您可以清楚地使用一种模式,而不是其他模式?

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

谢谢。

有帮助吗?

解决方案

构建器可以帮助您构建一个复杂的对象。一个例子是 StringBuilder 班级 (爪哇, C#),逐件构建最后的弦乐。一个更好的例子是 Uricomponentsbuilder 在春季,这可以帮助您构建URI。

一种工厂方法使您一镜头(与建筑商相反)一个完整的对象。基类定义了单个抽象方法,该方法返回接口(或超级类)参考,并捍卫对象对子类的具体创建。

抽象工厂是一个接口(或抽象类),可创建许多不同的相关对象。一个很好的例子(.net)是 DbProviderFactory 类,该类可根据其具体实现来创建相关对象(连接,命令,...)到给定的数据库提供商(Oracle,SQL Server,...)。

其他提示

建筑商

// 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
...

摘要工厂,工厂方法,建造者 :所有这些模式都是创造模式, 涉及对象创建机制的设计模式, ,试图以适合这种情况的方式创建对象。

工厂方法:

  1. 它定义了用于创建对象的接口, ,但是让子类决定要实例化哪个类
  2. 我们创建一个对象而不将创建逻辑公开给客户端 并使用常见接口(或抽象类)参考新创建的对象
  3. 通过消除将特定于应用程序的类绑定到代码的需要来提供松散耦合. 。代码仅与接口或抽象类交互
  4. 它可能会使用 继承或子分类 实现目标

    关键注意:您将创建这些接口的接口和特定实现。在工厂方法中,根据条件,您将获得普通接口的具体实现。

摘要工厂:

  1. 提供一个界面,用于创建相关对象或依赖对象的家庭 没有指定他们的具体课程
  2. 封装的层次结构:许多可能 “平台”```产品''
  3. 抽象的工厂课程通常用工厂方法实现, ,但也可以使用原型实现它们

建筑商:

  1. 构建器模式使用简单对象构建一个复杂的对象,并使用逐步方法
  2. 在这种情况下,更换为工厂方法/抽象工厂 :太多的论点无法从客户端程序传递到工厂类别,可能会出现错误
  3. 与工厂中的某些参数可能是可选的,该参数可以发送所有参数

Java中建造器设计模式的指南

  1. 在同类的内部制作一个静态的嵌套类,称为建筑商,其对象将由构建器构建
  2. 建筑商类将具有完全相同的字段 作为原始课程
  3. Builder类将暴露用于添加成分的方法. 。每种方法都会返回同一构建器对象。每个方法调用都将丰富构建器。
  4. builder.build()方法将将所有构建器字段值复制到实际类,并返回项目类的对象
  5. 项目类(我们要创建建筑商的类) 应该有私有构造函数从build()方法创建其对象,并防止局外人访问其构造函数。

相关文章:

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

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

有用的链接:

冒犯 设计模式

抽象的工厂模式使用(工厂的)子分类来生产 其他对象 (非事实)。摘要工厂还设想产生的对象属于平行层次结构(例如处理平台独立性,每个平台的一个层次结构)。

构建器模式使用子类生产“输出” - 根本不一定是对象. 。 GOF示例具有生成文本输出(标记或其他方式)的构建器。

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

这三个都是高度相似的,因为它们都使用子类。正是所有人的出色质量都掩盖了微妙的差异(上面概述),因此许多人很难看到差异。

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

例如,在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 ...
    }
}

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

  • 工厂方法模式 - 当您想建立复杂对象家族时。
  • 对象构建器模式 - 当您想允许用户将其自定义实现插入您的框架时

请访问以下URL以获取更多详细信息。

http://xeon2k.wordpress.com

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top