2009-10-05 11 views

Respuesta

12

Aunque esto no es necesariamente su uso principal, que es bueno para algo donde se han especializado instancias de una clase:

public ITax BuildNewSalesTax() 
public ITax BuildNewValueAddedTax() 

Se necesitan las dos métodos para construir un objeto de impuestos, pero que no quiere tener que depender de usar "nuevo" cada vez porque los constructores pueden ser complejos. De esta manera encapsulo todos los cambios en un solo método que es claro para otros para el mantenimiento futuro.

31

I tienen dos casos en los que tienden a utilizar es:

  1. El objeto necesita ser inicializado de alguna manera específica
  2. Cuando quiero construir un tipo específico basado en un tipo abstracto (un resumen clase o una interfaz).

Ejemplos:

  1. Primer caso podría ser que usted quiere tener una fábrica de creación de objetos SqlCommand, donde se conectan automáticamente una válida SqlConnection antes de devolver el objeto de comando.

  2. Segundo caso es si tiene una interfaz definida y determina en el tiempo de ejecución qué implementación exacta de la interfaz debe usar (por ejemplo, especificándola en un archivo de configuración).

0

Para responder a la segunda parte de la pregunta de que mi opinión, creo que la razón es mejor que la 'nueva' palabra clave es que el método de fábrica reduce la dependencia de los constructores de las clases particulares. Al usar un método de fábrica, usted delega la creación del objeto en cuestión a otra persona, por lo que la persona que llama no necesita el conocimiento de cómo crear el objeto.

20

Puede consultar la sección 9.5 Fábricas de Framework Design Guidelines 2nd Edition. Aquí es citado conjunto de directrices con respecto a la utilización de las fábricas más constructores:

prefiero constructores para fábricas, porque son generalmente más utilizable y coherente, y conveniente que los mecanismos especializados construcción.

considerar el uso de una fábrica si necesita de control más que puede ser proporcionada por constructores sobre la creación de los casos.

hace uso de una fábrica en los casos en que un desarrollador puede no saber qué tipo de construir, por ejemplo, cuando la codificación contra un tipo base o interfaz.

CONSIDER usar una fábrica si tener un método nombrado es la única manera de hacer la operación se explica por sí misma.

HACER uso de una fábrica para las operaciones de conversión .

Y de la sección 5.3 Constructor Diseño

considerar el uso de un método de fábrica estática en lugar de un constructor si los semántica de la operación deseada no se asignan directamente a la construc- ción de una nueva instancia, o si siguiendo las directrices de diseño del constructor se siente antinatural.

0

Es mejor tener un patrón de método de fábrica vs nueva palabra clave. La idea es mover una instanciación completa de objetos fuera de la lógica comercial. Este principio es el quid de dependency injection. Y, el trabajo del método de fábrica se puede delegar en un Marco de inyección de dependencia como Spring.net o Castle Windsor en un momento posterior.

+1

He trabajado en una base de código en el que cada "nuevo" se sustituyó por un delegado de la fábrica, totalmente COI Containered. Fue una pesadilla para trabajar. Después de un año y medio de desarrollo con 5 desarrolladores, se desechó. La funcionalidad fue reemplazada en 1 mes por 3 desarrolladores usando prácticas estándar de la industria. Desde mi experiencia, las fábricas son muy útiles en las instancias que señaló @Dzmitri. A menos que planee cambiar el tipo por configuración o tenga una lógica constructora muy interesante, creo que reemplazar las nuevas con las fábricas es exagerado y contraproducente. – Fred

1

Utilice el patrón Abstract Factory cuando un sistema debe ser independiente de cómo se crean, componen y representan sus productos. un sistema debe configurarse con una de las múltiples familias de productos. una familia de objetos de productos relacionados está diseñada para ser utilizada en conjunto, y necesita aplicar esta restricción. desea proporcionar una biblioteca de clases de productos, y desea revelar solo sus interfaces, no sus implementaciones.

-1

Creo que es cuando desea que su aplicación se acople y amplíe en el futuro sin cambios de codificación.

He escrito una publicación en el blog de por qué elijo el patrón de fábrica en mi proyecto y puede ser que pueda darle más información. El ejemplo está en PHP, pero creo que es aplicable en general a todos los idiomas.

http://www.mixedwaves.com/2009/02/implementing-factory-design-pattern/

5

estoy usando zuecos fábrica cuando

  1. Cuando una clase no sabe qué clase de objetos se debe crear.

  2. Una clase especifica sus subclases para especificar qué objetos crear.

  3. En el lenguaje del programador (forma muy cruda), puede utilizar el patrón de fábrica donde debe crear un objeto de cualquiera de las subclases según los datos proporcionados.

2

El patrón de método de fábrica se puede utilizar cuando existe la necesidad de generar objetos que pertenecen a una familia específica. Además de este requisito, también debe mantener las decisiones tomadas con respecto a la instanciación de objetos en un solo lugar.

Consulte el siguiente enlace para obtener más información.

http://xeon2k.wordpress.com/2010/11/27/factory-method-pattern/

24

utilizar un método de fábrica (fábrica no abstracto) cuando se desea volver a utilizar la funcionalidad común con diferentes componentes.

Ejemplo: Imagine que tiene un rifle M16. Algo como esto:

public class M16 
{ 
    private Scope scope = new StandardScope(); 
    private SecondaryWeapon secondary = new Bayonet(); 
    private Camouflage camo = new DesertCamo(); 

    public double getMass() 
    { 
     // Add the mass of the gun to the mass of all the attachments. 
    } 

    public Point2D shootAtTarget(Point2D targetPosition) 
    { 
     // Very complicated calculation taking account of lots of variables such as 
     // scope accuracy and gun weight. 
    } 
} 

Puede que le satisfaga por un tiempo, pensando que no querrá cambiar nada. Pero luego tienes que hacer una secreta misión nocturna de sigilo en la jungla, y te das cuenta de que tus archivos adjuntos son completamente inapropiados. Realmente necesitas un telescopio NightVision, JungleCamo y un arma secundaria GrenadeLauncher. Tendrás que copiar más allá del código de tu M16 original ... no es una buena extensibilidad ... ¡Método de fábrica para el rescate!

reescribir su clase M16:

public abstract class M16 
{ 
    private Scope scope = getScope(); 
    private SecondaryWeapon secondary = getSecondaryWeapon(); 
    private Camouflage camo = getCamouflage(); 

    public double getMass() 
    { 
     // Add the mass of the gun to the mass of all the attachments. 
    } 

    public Point2D shootAtTarget(Point2D targetPosition) 
    { 
     // Very complicated calculation taking account of lots of variables such as 
     // scope accuracy and gun weight. 
    } 

    // Don't have to be abstract if you want to have defaults. 
    protected abstract Scope getScope(); 
    protected abstract SecondaryWeapon getSecondaryWeapon(); 
    protected abstract Camouflage getCamouflage(); 
} 


//Then, your new JungleM16 can be created with hardly any effort (and importantly, no code //copying): 

public class JungleM16 : M16 
{ 
    public Scope getScope() 
    { 
     return new NightVisionScope(); 
    } 

    public SecondaryWeapon getSecondaryWeapon() 
    { 
     return new GrenadeLauncher(); 
    } 

    public Camouflage getCamouflage() 
    { 
     return new JungleCamo(); 
    } 
} 

idea principal? Personalice y cambie los objetos de composición mientras mantiene una funcionalidad común.

Un lugar realmente útil para usarlo: Acaba de diseñar una interfaz gráfica de usuario realmente genial, y tiene un diseño realmente complicado. Sería un verdadero dolor tener que diseñar todo de nuevo si quisiera tener diferentes widgets. Entonces ... use un método de fábrica para crear los widgets. Luego, si cambia de opinión (o si alguien más quiere usar su clase, pero usa diferentes componentes), puede subclase la GUI y anular los métodos de fábrica.

+2

Hola, es una gran explicación. ¿Has escrito algún tutorial que me guste leerlos ...? –

+1

Hola hombre, excelente explicación. Se hizo mucho más fácil de entender. Buen trabajo. – Flavio

0

El patrón de fábrica se ocupa de la creación de instancias del objeto sin exponer la lógica de creación de instancias. En otras palabras, una fábrica es en realidad un creador de objetos que tiene una interfaz común.

Deja que la subclase decida qué clase se creará.

Consideremos el siguiente ejemplo:

namespace TestApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Store is ordering the factory to get office shoes 
      Shoe shoe = ShoeFactory.GetShoes("OFFICE"); 
      Console.WriteLine(shoe.GetType()); //Will be office shoes 

      //Store is ordering the factory to get sports shoes 
      shoe = ShoeFactory.GetShoes("SPORTS"); 
      Console.WriteLine(shoe.GetType()); //Will be sports shoes 
     } 
    } 

    //This is the factory supplying shoes. It can supply sports shoes or office shoes 
    //based on demand 
    class ShoeFactory 
    { 
     public static Shoe GetShoes(string strShoeType) 
     { 
      switch (strShoeType) 
      { 
       case "SPORTS": return new SportShoe(); 
        break; 
       case "OFFICE": return new OfficeShoe(); 
        break; 
       default: 
        return null; 
      } 
     } 
    } 

    //This is an abstract class representing product family 
    //In this example, its shoe 
    public abstract class Shoe 
    { 

    } 

    //Office shoe is a concrete class belongs to shoe family 
    class OfficeShoe : Shoe 
    { 

    } 

    //Sports shoe is a concrete class belongs to shoe family 
    class SportShoe : Shoe 
    { 

    } 
} 
+0

Pero de todos modos aquí también estamos usando palabras clave nuevas. switch (strShoeType) { case "SPORTS": return new SportShoe(); break; caso "OFICINA": devolver el nuevo OfficeShoe(); break; predeterminado: return null; } Entonces, ¿cómo es que lo llamamos un patrón de fábrica? –

Cuestiones relacionadas