¿Cuál es la diferencia entre los patrones Factory y Strategy?

Respuestas:

227

Un patrón de fábrica es un patrón de creación. Un patrón de estrategia es un patrón operativo. 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 utiliza 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 de correr, caminar o pedalear.

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ía una estrategia. Si los datos fueran remotos en una base de datos diferente, usaría otra.

tvanfosson
fuente
1
`Se usa un patrón de estrategia para realizar una operación (o conjunto de operaciones) de una manera particular` ¿Significa operaciones sobre objetos?
OPV
32

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 hace un gran punto. Si utiliza el principio de codificación para abstracciones en lugar de "concreciones", muchos de los patrones comienzan a parecer variaciones sobre un tema.

jlembke
fuente
25

Solo para agregar a lo que dijo tvanfosson, muchos de los patrones se ven iguales en cuanto a la implementación. Es decir, muchas veces has creado una interfaz donde quizás no haya una antes en tu código, y luego creas un montón de implementaciones de esa interfaz. La diferencia está en su propósito y cómo se usan.

Gary Kephart
fuente
13
  • El patrón de fábrica (método).

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

  • El patrón de estrategia.

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

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

Entonces. Si su método Factory es fijo, puede tenerlo así:

 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 su fábrica necesita una 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 tiempo de ejecución.

OscarRyz
fuente
No creo que estés haciendo un punto correcto aquí. En primer lugar, una de las razones de estos patrones es evitar los condicionales a favor del polimorfismo. En primer lugar, debe establecerse una diferencia entre la fábrica simple y la fábrica abstracta.d La primera es una fábrica simple donde solo tiene una clase que actúa como una fábrica para la creación de objetos, mientras que en la última se conecta a una interfaz y luego llama 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. (continúa)
interboy
44
Exactamente en este caso, da como resultado un tipo de patrón de estrategia, pero difiere semánticamente porque se usa para la CREACIÓN DE OBJETOS en lugar de operaciones. Entonces, básicamente tienes creación de objetos usando diferentes estrategias.
interboy
2
@OscarRyz ¿Puede actualizar su respuesta con un programa que describa ambos?
Prakash Pandey
11

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

Por ejemplo, si desea botones con apariencia de Linux:

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

o si quieres botones de Windows

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

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

interboy
fuente
10

Factory (y FactoryMethod devuelto por Factory) :

  1. Patrón de creación
  2. Basado en herencia
  3. Factory devuelve un Método Factory (interfaz) que a su vez devuelve Objeto concreto
  4. Puede sustituir nuevos objetos concretos por la interfaz y el cliente (llamante) no debe conocer todas las implementaciones concretas
  5. El cliente siempre accede a la interfaz solamente y puede ocultar detalles de creación de objetos en el método Factory

Echa un vistazo a este artículo de Wikipedia y al artículo revisado de Java

Patrón de estrategia:

  1. Es un patrón de comportamiento
  2. Se basa en la delegación
  3. Cambia las tripas del objeto modificando el comportamiento del método.
  4. Se usa 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 (boleto de AirFare o artículo de ShoppingCart). En este ejemplo, ofrecerá un 25% de descuento para un artículo durante julio - diciembre y Sin descuento en el artículo durante Jaunary - Junio.

Artículos Relacionados:

Ejemplo del mundo real del patrón de estrategia

Patrones de diseño: Fábrica vs Método de fábrica vs Fábrica abstracta

Ravindra babu
fuente
3

Para ampliar lo que dijo Oscar y en referencia a su código:

GetCommand es Factory y las clases UnixCommand, WindowsCommand y OSXCommand son estrategias


fuente
3

El patrón de estrategia en términos simples es más una creación de comportamiento en tiempo de ejecución donde no le interesa la clase de implementación. Por otro lado, la fábrica es la creación en tiempo de ejecución de una instancia de clase concreta y depende de usted usar cualquier comportamiento (método) expuesto por la interfaz implementada.

Gurum
fuente
2

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

Estrategia: "Defina una familia de algoritmos, encapsule cada uno y hágalos 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 permita que las subclases decidan qué clase instanciar. El Método de fábrica permite que una clase difiera la instanciación a subclases".

Y aquí hay una explicación elaborada sobre las intenciones y las diferencias entre estos dos patrones: diferencia entre el método de fábrica y los patrones de diseño de la estrategia

Cristik
fuente
1

Puedo divagar con Oscar en que su ejemplo de implementación de Factory está estrechamente acoplado y muy cerrado, no es de extrañar que su elección sea el patrón de Estrategia. Una implementación de Factory no debe depender de ningún número fijo de clases específicas que se instancian, 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 el criterio más apropiado para elegir uno u otro es principalmente los términos que emplea para nombrar sus clases y métodos, teniendo en cuenta que todos deberíamos tender a programar en interfaces y no a clases y también centrarnos en el objetivo: nuestro objetivo es determinar qué código se ejecutará en tiempo de ejecución. Dicho esto, podemos lograr el objetivo utilizando cualquiera de los dos patrones.

Rick B.
fuente
1

Estrategia y Fábrica son propósitos diferentes. En la estrategia, tiene el enfoque definido, utilizando este patrón puede intercambiar el comportamiento (algoritmos). Al llegar a Factory hay muchas variaciones. Pero el patrón original de GO4 establece que la fábrica deja la creación del objeto a la clase secundaria. 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.

Brainchild
fuente
0

El patrón de fábrica es un patrón de creación, que se crea con propiedades específicas (comportamiento). mientras que en tiempo de ejecución después de la creación no puede cambiar sus propiedades (comportamiento). así que si necesita diferentes propiedades (comportamiento) debe 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.

usuario1808932
fuente