Pregunta

Puede parecer como si esto fuera cuestión es una víctima, pero por favor tengan paciencia conmigo - Prometo que ha leído los mensajes relacionados (y la libro GOF ).

Después de todo lo que he leído, yo todavía no tengo claro cuándo utilizar una fábrica abstracta, un método de fábrica, o un constructor. Creo que finalmente se hundirá en después de ver un ejemplo sencillo de un problema que se aborda mejor por, digamos, un constructor y sería claramente absurdo uso, por ejemplo, un fábrica de resumen .

¿Puede dar un ejemplo sencillo en el que se utilizaría claramente un patrón y no a los otros?

Yo entiendo que puede se reducen a una cuestión de opinión si el ejemplo es demasiado simple, pero tengo la esperanza de que si alguien puede, esa persona está en SO.

Gracias.

¿Fue útil?

Solución

Un constructor le ayuda a construir un objeto complejo. Un ejemplo es la clase StringBuilder ( Java , C # ), que construye la pieza de cadena final por pieza. Un mejor ejemplo es la UriComponentsBuilder en la primavera, lo que le ayuda a construir un URI.

Un método de fábrica le da un objeto completo de una sola vez (en comparación con el constructor). Una clase base define un único método abstracto que devuelve un interfaz (o super clase) de referencia, y difiere la creación concreta del objeto a subclases.

Una fábrica abstracta es una interfaz (o clase abstracta) para crear diversos objetos relacionados. Un buen ejemplo (en .NET) es el DbProviderFactory clase, que sirve para crear objetos relacionados (conexiones, comandos, ...) a un proveedor de base de datos dada (Oracle, SQL Server, ...), dependiendo de su aplicación concreta.

Otros consejos

Constructor

// 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();
}

Método de fábrica

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

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

Abstract Factory, Factory Method, Constructor : Todos estos patrones son patrones de creación, que son patrones de diseño que tienen que ver con los mecanismos de creación de objetos , tratando de crear objetos de una manera adecuado a la situación.

Método de fábrica:

  1. Define una interfaz para crear un objeto , ¡pero subclases decidir qué clase instanciar
  2. Creamos un objeto sin exponer la lógica de la creación para el cliente y se refieren a objeto recién creado utilizando una interfaz común (o una clases abstractas)
  3. Proporciona suelta de acoplamiento al eliminar la necesidad de clases específicas de la aplicación se unen en el código . interactúa con código única interfaz o clase abstracta
  4. Puede utilizar herencia o sub classing para lograr el propósito

    Nota Clave: Va a crear una implementación de la interfaz y específica de estas interfaces. En el método de fábrica, dependiendo de la condición, obtendrá aplicación concreta de interfaz común.

Resumen de fábrica:

  1. Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas
  2. Una jerarquía que encapsula muchos posibles: "plataformas" `, y la construcción de un conjunto de "productos"
  3. clases Resumen de fábrica a menudo se implementan con métodos de fábrica , pero también pueden ser implementados utilizando Prototipo

Constructor:

  1. Builder construye un objeto complejo usando objetos simples y usando un enfoque paso a paso
  2. Reemplazo al método de fábrica / Abstract Factory en este escenario : demasiados argumentos para pasar de programa cliente para la clase de fábrica que puede ser propenso a errores
  3. Algunos de los parámetros podría ser opcional al contrario que en la fábrica que las fuerzas de enviar todos los parámetros

Directrices para el patrón de diseño del constructor en Java

  1. Hacer una clase anidada estática llamada del constructor dentro de la clase cuyo objeto será construido por el constructor
  2. El generador de clase tendrá exactamente el mismo conjunto de campos como clase original
  3. clase Constructor expondrá método para añadir ingredientes . Cada método devolverá mismo objeto constructor. Constructor se enriquece con cada llamada al método.
  4. método Builder.build () copiará todos los valores de campo en constructor de clase real y el objeto de retorno de la clase de artículo
  5. clase de artículos (clase para la cual estamos creando Constructor) debe tener constructor privado para crear su objeto de acumulación () método y prevenir ajena para acceder a su constructor.

Puestos relacionados con:

Patrones de diseño: Fábrica vs método de fábrica Resumen vs fábrica

Mantener constructor en clase separada (interfaz fluida)

Enlaces útiles:

sourcemaking diseño-patrones

Los usos patrón Abstract Factory subclases (de fábricas) para producir otros objetos (no fábricas). Abstract Factory también prevé que los objetos producidos pertenecen a jerarquías paralelas (por ejemplo para manejar la independencia de plataforma, una jerarquía para cada plataforma).

Los usos Builder subclases para producir "salida" - que es objetos no necesariamente en absoluto . El ejemplo GOF tiene la salida de texto producir Builder (marcado o de otra manera).

El patrón Factory Method, a diferencia de los otros dos, divide el "creador" en una implementación abstracta y concreta (de ahí el énfasis en que la pertenencia a un marco de implementación). Como Abstract Factory, se trata de hacer que los objetos reales.

Los tres son muy similares, ya que todo el uso de subclases. Es la creación de subclases que es la excelente calidad de todos ellos, que oculta las diferencias sutiles (descrito anteriormente) y por lo tanto muchas personas tienen dificultad para ver las diferencias.

Abstract Factory es particularmente útil para el desarrollo basado en pruebas y el acoplamiento reductor.

Por ejemplo, en 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 ...
    }
}

De esta manera, se puede utilizar la inyección de dependencias para inyectar las implementaciones por defecto para el código de producción, y luego se puede burlar fácilmente la fábrica y los objetos que crea.

    patrón
  • Factory Method -. Cuando se desea la familia de construcción de objetos complejos
  • Builder Objeto - Cuando se desea permitir al usuario Plugin su aplicación personalizada en el marco

Por favor, visite la siguiente URL para obtener más detalles.

http://xeon2k.wordpress.com

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top