¿Alguien puede explicar la diferencia entre los patrones de fábrica y de estrategia?
Para mí, ambos se ven iguales aparte de una clase de fábrica adicional (que crea un objeto de producto en patrones de fábrica)
¿Alguien puede explicar la diferencia entre los patrones de fábrica y de estrategia?
Para mí, ambos se ven iguales aparte de una clase de fábrica adicional (que crea un objeto de producto en patrones de fábrica)
Respuestas:
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.
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.
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.
Crear instancias concretas solamente. Diferentes argumentos pueden dar lugar a diferentes objetos. Depende de la lógica, etc.
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.
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.
Factory (y FactoryMethod devuelto por Factory) :
Echa un vistazo a este artículo de Wikipedia y al artículo revisado de Java
Patrón de estrategia:
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
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
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.
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
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.
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.
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.