strategy pattern patrones patron estrategia diseño diferencia comportamiento java design-patterns factory-pattern strategy-pattern abstract-factory

pattern - strategy java



¿Cuál es la diferencia entre los patrones de fábrica y estrategia? (12)

El patrón de estrategia en términos simples es más de creación de comportamiento en tiempo de ejecución donde no le preocupa la clase de implementación. 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.

¿Alguien puede explicar la diferencia entre los patrones de fábrica y estrategia?

Para mí, ambos se ven igual que una clase de fábrica adicional (que crea un objeto de producto en los patrones de fábrica)


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


El patrón de fábrica es un patrón creacional, 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.


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 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, resulta en un tipo 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.


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.


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

Estrategia: "Defina una familia de algoritmos, encapsule cada uno y haga que sean 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 instanciar. Factory Method permite que una clase retrase la creación de instancias en subclases".

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


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

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


Puedo hacer una digresión con Oscar en el sentido de que su ejemplo de implementación de Fábrica está bastante unido y muy cerrado, no es de extrañar que su elección sea el patrón de Estrategia. La implementación de Factory no debe depender de ninguna cantidad fija de clases específicas que se estén instanciando, 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 son principalmente los términos que emplea para nombrar sus clases y métodos, teniendo en cuenta que todos deberíamos tender a programar 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.


Solo para agregar a lo que dijo Tvanfosson, muchos de los patrones parecen iguales 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.


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.


Fábrica (y FactoryMethod devuelto por Factory) :

  1. Patrón de creación
  2. Basado en la herencia
  3. La fábrica devuelve un método de fábrica (interfaz) que a su vez devuelve un objeto concreto
  4. Puede sustituir los nuevos objetos concretos por la interfaz y el cliente (llamador) 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 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 agallas del objeto modificando el comportamiento del método
  4. Se usa para cambiar entre 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 AirFare o elemento 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.

Artículos Relacionados:

Ejemplo del mundo real del patrón de estrategia

Patrones de diseño: método Factory vs Factory vs Abstract Factory


  • El patrón Factory (método).

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

  • El patrón de estrategia.

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

Asi que. 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 el tiempo de ejecución.