2010-03-29 18 views
6

Mi comprensión de Factory Method es (Corrígeme si estoy equivocado)Factory Method

Método de fábrica del patrón

"Método de fábrica permitir que el cliente delega la creación del producto (Creación de instancias) a la subclase ".

Hay dos situaciones en las que podemos crear un patrón de método de fábrica.

(i) Cuando el cliente está restringido a la creación del producto (Instancia).

(ii) Hay varios productos available.but una decisión a la que se hará instancia de producto necesidad de ser devueltos.

Si desea crear Resumen patrón Método

  • Es necesario tener producto abstracto
  • hormigón Producto
  • Método de fábrica para devolver el producto adecuado.

Ejemplo:

public enum ORMChoice 
{ 
    L2SQL, 
    EFM, 
    LS, 
    Sonic 
} 
//Abstract Product 
public interface IProduct 
{ 
    void ProductTaken(); 
} 
//Concrete Product 
public class LinqtoSql : IProduct 
{ 
    public void ProductTaken() 
    { 
    Console.WriteLine("OR Mapping Taken:LinqtoSql"); 
    } 
} 
//concrete product 
public class Subsonic : IProduct 
{ 
    public void ProductTaken() 
    { 
     Console.WriteLine("OR Mapping Taken:Subsonic"); 
    } 
} 
//concrete product 
public class EntityFramework : IProduct 
{ 
    public void ProductTaken() 
    { 
     Console.WriteLine("OR Mapping Taken:EntityFramework"); 
    } 
    } 
//concrete product 
public class LightSpeed : IProduct 
{ 
    public void ProductTaken() 
    { 
    Console.WriteLine("OR Mapping Taken :LightSpeed"); 
    } 
    } 

public class Creator 
{ 
    //Factory Method 
    public IProduct ReturnORTool(ORMChoice choice) 
    { 
     switch (choice) 
     { 
     case ORMChoice.EFM:return new EntityFramework(); 
     break; 
     case ORMChoice.L2SQL:return new LinqtoSql(); 
     break; 
     case ORMChoice.LS:return new LightSpeed(); 
     break; 
     case ORMChoice.Sonic:return new Subsonic(); 
     break; 
     default: return null; 
     } 
    } 

} 

**Client** 

Button_Click() 
{ 
Creator c = new Creator(); 
IProduct p = c.ReturnORTool(ORMChoice.L2SQL); 
p.ProductTaken(); 

} 

es mi entendimiento del método de fábrica es la correcta?

+0

por cierto, usando un 'enum' de este tipo es probable que resulte en innecesaria' switch'-ción. En tales casos, prefiero usar una función diferente para cada opción. –

Respuesta

1

Lo que tiene allí es en realidad más de Abstract Factory Pattern, solo que su fábrica (Creator) no es abstracta. El patrón método factor es específicamente útil para la subclasificación:

class A { 
public: 
    A() : m_Member(GetMember()) 
    { 
    } 
protected: 
    virtual ISomeInterface * GetMember() { // default impl here } 
private: 
    ISomeInterface * m_Member; 
} 

Ahora subclases de A puede anular GetMember para hacer la superclase utilizar una implementación específica de ISomeInterface.

+0

jajaja, esto realmente me hizo reír cuando me estabas corrigiendo sobre esto ** no ** siendo un * Factory Pattern * !! De ninguna manera estoy discutiendo contigo, solo lo leí en voz alta. Con un ligero cambio de palabras: "Lo que tienes es un * Patrón abstracto de fábrica * solo que tu fábrica no es abstracta". ¿No sería un * Patrón de fábrica abstracto * sin la parte abstracta un * Patrón de fábrica *? ;-) (Completo irónico aquí - No estoy familiarizado con la diferencia entre los dos.) – Jaxidian

+0

Entiendo cómo suena gracioso. Sin embargo, elijo la fraseología porque el patrón abstracto de fábrica tiene dos grados de libertad: la fábrica y los productos. El caso en el que solo hay una fábrica (y por lo tanto no es necesario que se suspenda) ocurre muy a menudo, al menos en mi experiencia, y puede considerarse un caso especial. Además, el libro GOF enumera el patrón como patrón abstracto de fábrica y es importante usar los nombres correctos. –

+0

¡Así es! De hecho, lo primero dentro del libro, en la portada, es una propaganda sobre Abstract Factory. Ahora recuerdo cuando leí por primera vez que pensaba: "Eso suena como un patrón estándar de fábrica". Lo hice con bastantes de sus patrones. Sin embargo, quiero aprender un poco sobre su "nombre correcto". Hay muchos nombres para la misma cosa que se consideran "correctos". El hecho de que GOF lo llame algo, aunque eso sea un poco ** el libro ** de patrones, no significa que sea el único correcto. Después de todo, es bastante anticuado ... – Jaxidian

-1

Sí, parece ser una forma correcta de implementar esto, aunque es bastante simple. En realidad, es posible que desee contabilizar el ingreso de varios parámetros que pueden no ser consistentes en todos los tipos. Diccionarios/Listas/Hashtables/etc. son útiles para esto, como lo son los artículos serializados y/o XML y otras cosas dinámicas.

+1

-1 porque, como señalé en mi respuesta, este no es un método de fábrica, por lo que esta no es una forma correcta de implementar esto. –