Pregunta

¿Puede alguien explicar la diferencia entre los patrones de fábrica y de estrategia?

Para mí, ambos tienen el mismo aspecto que una clase de fábrica adicional (que crea un objeto de producto en patrones de fábrica)

¿Fue útil?

Solución

Un patrón de fábrica es un patrón de creación. Un patrón de estrategia es un patrón operacional. Dicho de otra manera, se utiliza 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; utilizando las estrategias Run, Walk o Lope.

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

Otros consejos

El patrón de estrategia le permite cambiar de forma polimórfica 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 a abstracciones en lugar de " concreciones " luego, muchos de los patrones comienzan a verse como variaciones en un tema.

Solo 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 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 en cómo se utilizan.

  • El patrón de fábrica (método).

Crear solo instancias concretas. Diferentes argumentos pueden resultar en diferentes objetos. Depende de la lógica etc.

  • El patrón de estrategia.

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

Aunque ambos se ven 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 de Fábrica 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 suponga 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 compilarla, 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 en la que 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, que se implementa en dos fábricas, la primera WindowsButtonCreationFactory (crea botones con apariencia de Windows) y la segunda LinuxButtonCreationFactory (crea botones con apariencia y apariencia de Linux). Así que ambas 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 quieres 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 un tipo de patrón de estrategia, ya que diferencia los algoritmos para hacer alguna creación. Sin embargo, difiere de él semánticamente porque se usa para la CREACIÓN DE OBJETOS en lugar de los algoritmos operativos. Así que, básicamente, con Abstract Factory tiene creación de objetos utilizando diferentes estrategias, lo que lo hace muy similar al patrón de estrategia. Sin embargo, AbstractFactory es creativo, mientras que el patrón de la Estrategia es operativo. En cuanto a la implementación, resultan ser lo mismo.

Factory (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 el Objeto concreto
  4. Puede sustituir los nuevos Objetos concretos por interfaz y el cliente (persona que llama) no debe conocer todas las implementaciones concretas
  5. El cliente siempre accede solo a la interfaz y puede ocultar los detalles de creación de objetos en el método de fábrica

Echa un vistazo a este artículo de wikipedia y javarevisited article

Patrón de estrategia:

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

Publicaciones relacionadas:

Ejemplo del mundo real del patrón de estrategia

Patrones de diseño: método de fábrica contra fábrica vs Abstract Factory

El patrón de estrategia en términos simples es más una creación de comportamiento en tiempo de ejecución cuando no le interesa la clase implementadora. Por otro lado, factory 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.

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

getCommand es Factory y las clases UnixCommand, WindowsCommand y OSXCommand son Estrategias

Puedo divagar con Oscar porque su ejemplo de una implementación de Factory está bastante unido 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 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 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 programar a las interfaces y no a las clases y también a enfocarnos en el objetivo: el 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 diferentes propósitos. En estrategia usted tiene el enfoque definido, utilizando este patrón puede intercambiar el comportamiento (algoritmos). Llegando a Factory hay muchas variaciones alrededor. 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 en el que está interesado. Con esto, reemplazará el sistema completo, no el algoritmo.

No puedes entender la diferencia simplemente mirando el código o la categorización. Para captar los patrones de GoF correctamente, 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 utilizan. & Quot;

Método de fábrica: " Define una interfaz para crear un objeto, pero deja que las subclases decidan qué clase crear una instancia. El Método de fábrica permite que una clase difiera la creación de instancias a las subclases. & Quot;

Y aquí hay una explicación detallada 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

El patrón de fábrica es un patrón de creación, que se crea con las propiedades especificadas (comportamiento). mientras que en el 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 de un patrón de estrategia, puede cambiar las propiedades (comportamiento) en tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top