Respuesta

146

Un patrón de fábrica es un patrón creacional. Un patrón de estrategia es un patrón operacional. Dicho de otra manera, se usa un patrón de fábrica para crear objetos de un tipo específico. Un patrón de estrategia se usa para realizar una operación (o conjunto de operaciones) de una manera particular. En el ejemplo clásico, una fábrica podría crear diferentes tipos de Animales: Perro, Gato, Tigre, mientras que un patrón de estrategia realizaría acciones particulares, por ejemplo, Mover; usando estrategias Run, Walk o Lope.

De hecho, los dos se pueden usar juntos. Por ejemplo, puede tener una fábrica que cree sus objetos comerciales. Puede usar diferentes estrategias basadas en el medio de persistencia. Si sus datos se almacenan localmente en XML, usarían una estrategia. Si los datos fueran remotos en una base de datos diferente, usaría otra.

20

El patrón de estrategia le permite cambiar polimórficamente el comportamiento de una clase.

El patrón de fábrica le permite encapsular la creación de objetos.

Gary es un gran punto. Si está utilizando el principio de codificación para abstracciones en lugar de "concreciones", muchos de los patrones comienzan a verse como variaciones en un tema.

15

Para agregar a lo que dijo tvanfosson, muchos de los patrones tienen el mismo aspecto en cuanto a la implementación. Es decir, mucho has creado una interfaz donde quizás no había una en tu código, y luego creas muchas implementaciones de esa interfaz. La diferencia está en su propósito y cómo se usan.

9
  • Patrón de fábrica (método).

Crear instancias concretas solamente. Diferentes argumentos pueden dar como resultado diferentes objetos. Depende de la lógica, etc.

  • The Strategy Pattern.

Encapsula el algoritmo (pasos) para realizar una acción. Entonces puedes cambiar la estrategia y usar otro algoritmo.

Si bien ambos parecen muy similares, el propósito es bastante diferente, uno de los propósitos es crear el otro es realizar una acción.

So. Si se fija el método de fábrica, es posible que de esta manera:

public Command getCommand(int operatingSystem) { 
     switch(operatingSystem) { 
      case UNIX : 
      case LINUX : return new UnixCommand(); 
      case WINDOWS : return new WindowsCommand(); 
      case OSX  : return new OSXCommand(); 
     } 
    } 

Pero supongamos que la fábrica necesita la creación más avanzada o dinámica. Puede agregar una estrategia al método de fábrica y cambiarla sin tener que volver a compilar, la estrategia puede cambiar en el tiempo de ejecución.

+0

que no creo que usted está haciendo un punto aquí. En primer lugar, una de las razones de estos patrones es evitar condicionales a favor del polimorfismo. En primer lugar, se debe hacer una diferencia entre fábrica simple y fábrica abstracta.d La primera es una fábrica simple en la que solo tiene una clase que actúa como fábrica para la creación de objetos, mientras que en la segunda se conecta a una interfaz y luego llama a las diferentes fábricas que implementan esta interfaz que se supone que tienen diferentes implementaciones de el mismo método basado en algunos criterios. (continúa) – interboy

+3

Exactamente en este caso, da como resultado un tipo de patrón de estrategia, pero difiere de él semánticamente porque se usa para la CREACIÓN DE OBJETOS más que para las operaciones. Entonces, básicamente tienes creación de objetos usando diferentes estrategias. – interboy

+0

@OscarRyz ¿Puede actualizar su respuesta con un programa que describa ambos –

2

Extender sobre lo que dijo Oscar y en referencia a su código:

El getCommand es la fábrica y el UnixCommand, clases WindowsCommand y OSXCommand son estrategias

1

se me permite una digresión con Oscar en que su ejemplo de una implementación de Fábrica es bastante estrecha y muy cerrada, no es de extrañar que su elección sea el patrón de Estrategia. Una implementación de fábrica no debe depender de cualquier número fijo de clases específicas que se crea una instancia, por ejemplo:

public Command getCommand(int operatingSystem) {   
    return commandTable.get(operatingSystem); 
} 

... 

public class WindowsCommand implements Command { 
    ... 
    static { 
     CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand()); 
    } 

} 

supongo que los criterios más adecuados para elegir uno u otro es sobre todo los términos que emplean para asignar nombres a las clases y los métodos, Teniendo en cuenta que todos deberíamos tender a programar interfaces y no a clases y también enfocarnos en el objetivo: buscamos determinar qué código se ejecutará en tiempo de ejecución. Dicho esto, podemos lograr el objetivo utilizando cualquiera de los dos patrones.

1

Estrategia y fábrica son diferentes propósitos. En estrategia tienes el enfoque definido, usando este patrón puedes intercambiar el comportamiento (algoritmos). Viniendo a la fábrica hay muchas variaciones alrededor. Pero el patrón original de la fábrica de estados GO4 deja la creación del objeto como clase infantil. Aquí con la fábrica está reemplazando la instancia completa no el comportamiento que le interesa. Con esto reemplazará el sistema completo, no el algoritmo.

5

En primer lugar, se debe hacer una diferencia entre fábrica simple y fábrica abstracta. La primera es una fábrica simple donde solo tiene una clase que actúa como fábrica para la creación de objetos, mientras que en la segunda se conecta a una interfaz de fábrica (que define los nombres del método) y luego llama a las diferentes fábricas que implementan esta interfaz que se supone que tienen diferentes implementaciones del mismo método en función de algunos criterios. Por ejemplo, tenemos una interfaz ButtonCreationFactory, que es implementada por dos fábricas, la primera WindowsButtonCreationFactory (crea botones con apariencia de Windows) y la segunda LinuxButtonCreationFactory (crea botones con apariencia y sensación de Linux). Entonces, estas dos fábricas tienen el mismo método de creación con diferentes implementaciones (algoritmos). Puede hacer referencia a esto en tiempo de ejecución según el método que escriba del botón que desee.

Por ejemplo, si desea botones con aspecto de Linux y la sensación:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

o si desea que Windows botones

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

Exactamente en este caso, el resultado es una especie de patrón de estrategia, ya que diferencia los algoritmos para hacer alguna creación. Sin embargo, se diferencia de él semánticamente porque se usa para la CREACIÓN DE OBJETOS en lugar de algoritmos operativos. Entonces, básicamente con la fábrica abstracta tiene creación de objetos usando diferentes estrategias, lo que la hace muy similar al patrón de estrategia. Sin embargo, AbstractFactory es creacional, mientras que el patrón de Estrategia está operativo. Implementación sabia, resultan ser iguales.

0

El patrón de fábrica es un patrón creado, que se crea con propiedades específicas (comportamiento). mientras que en el tiempo de ejecución después de la creación no cambias sus propiedades (comportamiento). entonces si necesita propiedades diferentes (comportamiento) tiene que eliminar el objeto y crear un nuevo objeto con las propiedades necesarias (comportamiento). que no es gud mientras que en el caso del patrón de estrategia puede cambiar las propiedades (comportamiento) en tiempo de ejecución.

0

No puede entender la diferencia simplemente mirando el código o la categorización.Para comprender correctamente los patrones de GoF, busque sus intenciones:

Estrategia: "Definir una familia de algoritmos, encapsular cada uno y hacerlos intercambiables. La estrategia permite que el algoritmo varíe independientemente de los clientes que lo usan".

Método de fábrica: "Defina una interfaz para crear un objeto, pero deje que las subclases decidan qué clase crear. Factory Method permite que una clase retrase la creación de instancias en subclases".

Y aquí una explicación elaborada sobre las intenciones y las diferencias entre estos dos patrones: Difference between Factory Method and Strategy design patterns

2

patrón de estrategia en términos simples es más de la creación de tiempo de ejecución de la conducta en la que no tienen que ver con la clase que implementa. Por otro lado, la fábrica tiene la creación en tiempo de ejecución de una instancia de clase concreta y depende de usted el uso de cualquier comportamiento (método) expuesto por la interfaz implementada.

3

de fábrica (y FactoryMethod devueltos por fábrica):

  1. patrón Creacional
  2. Basado en herencia
  3. fábrica devuelve un método de fábrica (interface) que a su vez devuelve objeto concreto
  4. Usted puede sustituir nuevos objetos concretos por la interfaz y el cliente (llamador) no debe conocer todas las implementaciones concretas
  5. Cl ient siempre acceder a la interfaz única y se puede ocultar los detalles de creación de objetos en el método de fábrica

Tener un vistazo a este patrón wikipedia article y javarevisited article

Estrategia:

  1. Es un patrón de comportamiento
  2. Se basa en la delegación
  3. Cambia las agallas del objeto al modificarme comportamiento DTO
  4. Se utiliza para cambiar entre la familia de algoritmos
  5. Cambia el comportamiento del objeto en tiempo de ejecución

Ejemplo:

Puede configurar la estrategia de descuento para un artículo en particular (billete de avión boleto o artículo de ShoppingCart). En este ejemplo, ofrecerá un 25% de descuento en un artículo durante julio - diciembre y ningún descuento en el artículo durante Jaunary - junio.

mensajes relacionados:

Real World Example of the Strategy Pattern

Design Patterns: Factory vs Factory method vs Abstract Factory

Cuestiones relacionadas