Question

Quelqu'un peut-il expliquer la différence entre les modèles d'usine et les modèles de stratégie?

Pour moi, les deux sont identiques, à l'exception d'une classe d'usine supplémentaire (qui crée un objet de produit dans des modèles d'usine)

Était-ce utile?

La solution

Un motif d'usine est un motif de création. Un modèle de stratégie est un modèle opérationnel. En d'autres termes, un modèle d'usine est utilisé pour créer des objets d'un type spécifique. Un modèle de stratégie est utilisé pour effectuer une opération (ou un ensemble d'opérations) d'une manière particulière. Dans l'exemple classique, une usine peut créer différents types d'animaux: Dog, Cat, Tiger, tandis qu'un modèle de stratégie exécute des actions particulières, par exemple Move; en utilisant des stratégies Run, Walk ou Lope.

En fait, les deux peuvent être utilisés ensemble. Par exemple, vous pouvez avoir une usine qui crée vos objets métier. Il peut utiliser différentes stratégies basées sur le support de persistance. Si vos données sont stockées localement en XML, elles utiliseraient une stratégie. Si les données étaient distantes dans une base de données différente, il en faudrait une autre.

Autres conseils

Le modèle de stratégie vous permet de modifier de manière polymorphe le comportement d'une classe.

Le modèle d'usine vous permet d'encapsuler la création d'objets.

Gary fait valoir un bon point. Si vous utilisez le principe de codage d'abstractions plutôt que de "concrétions" alors beaucoup de motifs commencent à ressembler à des variations sur un thème.

Pour ajouter à ce que tvanfosson a dit, beaucoup de modèles se ressemblent en ce qui concerne la mise en œuvre. C'est-à-dire que vous avez souvent créé une interface où il n'y en avait peut-être pas auparavant dans votre code, puis créé un ensemble d'implémentations de cette interface. La différence réside dans leur objectif et leur utilisation.

  • Le modèle Factory (méthode).

Créez uniquement des instances concrètes. Différents arguments peuvent entraîner différents objets. Cela dépend de la logique, etc.

  • Le modèle de stratégie.

Encapsulez l'algorithme (étapes) pour effectuer une action. Vous pouvez donc changer de stratégie et utiliser un autre algorithme.

Bien que les deux ressemblent beaucoup, le but est assez différent, l'un des buts étant de créer l'autre, d'effectuer une action.

Alors. Si votre méthode Factory est corrigée, vous pouvez l’avoir comme ceci:

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

Mais supposons que votre usine nécessite une création plus avancée ou dynamique. Vous pouvez ajouter à la méthode d'usine une stratégie et la modifier sans avoir à recompiler, la stratégie peut changer en cours d'exécution.

Tout d’abord, une différence doit être faite entre fabrique simple et fabrique abstraite. La première est une fabrique simple dans laquelle vous n’avez qu’une classe qui agit en tant que fabrique pour la création d’objets, tandis que dans la dernière vous vous connectez à une interface de fabrique (qui définit les noms de méthodes), puis appelez les différentes fabriques qui implémentent cette interface. sont supposés avoir différentes implémentations de la même méthode en fonction de certains critères. Par exemple, nous avons une interface ButtonCreationFactory, qui est implémentée par deux usines, la première WindowsButtonCreationFactory (crée des boutons avec l'apparence de Windows) et la seconde LinuxButtonCreationFactory (crée des boutons avec l'apparence de Linux). Ces deux usines ont donc la même méthode de création avec différentes implémentations (algorithmes). Vous pouvez faire référence à cela au moment de l'exécution en fonction de la méthode de type de bouton souhaitée.

Par exemple, si vous souhaitez des boutons ayant l'apparence de Linux:

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

ou si vous voulez des boutons Windows

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

Exactement dans ce cas, il en résulte une sorte de modèle de stratégie, car il différencie les algorithmes pour effectuer certaines créations. Cependant, il en diffère sémantiquement car il est utilisé pour la création d'objet plutôt que pour des algorithmes opérationnels. Donc, fondamentalement, avec la fabrique abstraite, vous créez des objets en utilisant différentes stratégies, ce qui les rend très similaires au modèle de stratégie. Cependant, AbstractFactory est créatif, tandis que le modèle de stratégie est opérationnel. Du point de vue de la mise en œuvre, ils sont identiques.

Factory (et FactoryMethod renvoyé par Factory) :

  1. Modèle de création
  2. Basé sur l'héritage
  3. Factory renvoie une méthode Factory (interface) qui à son tour renvoie un objet concret
  4. Vous pouvez substituer de nouveaux objets concrets à l'interface et le client (appelant) ne doit pas être au courant de toutes les implémentations concrètes
  5. Le client n'a toujours accès qu'à l'interface et vous pouvez masquer les détails de la création d'objet dans la méthode Factory

Consultez cet article de Wikipédia et article javarevisited

Modèle de stratégie:

  1. C'est un comportement comportemental
  2. Il repose sur la délégation
  3. Cela change les entrailles de l'objet en modifiant le comportement de la méthode
  4. Il est utilisé pour passer d'une famille d'algorithmes à une autre
  5. Cela change le comportement de l'objet au moment de l'exécution

Exemple:

Vous pouvez configurer la stratégie de remise pour un article particulier (billet d'avion ou article de panier d'achat). Dans cet exemple, vous offrirez une réduction de 25% sur un article en juillet - décembre et aucune réduction sur cet article en janvier - juin.

Articles connexes:

Exemple concret du modèle de stratégie

Modèles de conception: méthode Factory ou méthode Factory vs Abstract Factory

En termes simples, le modèle de stratégie est davantage une création de comportement à l'exécution, dans laquelle vous n'êtes pas concerné par la classe d'implémentation. De l’autre, l’usine est la création au moment de l’exécution d’une instance de classe concrète et il vous appartient d’utiliser tout comportement (méthode) exposé par l’interface implémentée.

Pour prolonger ce que Oscar a dit et en référence à son code:

getCommand est la fabrique et les classes UnixCommand, WindowsCommand et OSXCommand sont des stratégies

Je peux faire une digression avec Oscar en ce que son exemple d'implémentation d'usine est plutôt étroitement couplé et très fermé, pas étonnant que votre choix soit le modèle de stratégie. Une implémentation de type Factory ne doit dépendre d'aucun nombre fixe de classes spécifiques en cours d'instanciation. Par exemple:

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

...

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

}

Je suppose que le critère le plus approprié pour choisir l’un ou l’autre est principalement les termes que vous utilisez pour nommer vos classes et méthodes, en prenant en compte le fait que nous devrions tous avoir tendance à programmer en interfaces et non en classes et à nous concentrer sur l’objectif suivant: nous visent à déterminer quel code sera exécuté à l'exécution. Cela dit, nous pouvons atteindre cet objectif en utilisant l’un des deux modèles.

Strategy et Factory ont des objectifs différents. En stratégie, vous définissez l'approche, en utilisant ce modèle, vous pouvez échanger le comportement (algorithmes). Venir à l'usine, il y a beaucoup de variations autour. Mais le modèle d'origine de GO4 States Factory laisse la création d'objet à la classe enfant. Ici, avec l'usine, vous remplacez l'instance complète et non le comportement qui vous intéresse. Vous remplacerez ainsi le système complet et non l'algorithme.

Vous ne pouvez pas comprendre la différence en regardant simplement le code ou la catégorisation. Pour saisir correctement les modèles GoF, recherchez leurs intentions:

Stratégie: "Définissez une famille d’algorithmes, encapsulez-les et rendez-les interchangeables. La stratégie permet à l’algorithme de varier indépendamment des clients qui l’utilisent. "

Méthode d'usine: "Définissez une interface pour la création d'un objet, mais laissez les sous-classes décider de la classe à instancier. La méthode d'usine permet à une classe de différer l'instanciation en sous-classes. "

Et voici une explication complexe sur les intentions et les différences entre ces deux modèles: Différence entre les patterns de conception Méthode d'usine et Stratégie

Le modèle d'usine est un modèle de création créé avec les propriétés spécifiées (comportement). au moment de l'exécution après la création, vous ne pouvez pas modifier ses propriétés (comportement). donc si vous avez besoin de propriétés différentes (comportement), vous devez supprimer l'objet et créer un nouvel objet avec les propriétés nécessaires (comportement). ce qui n'est pas gud. En cas de modèle de stratégie, vous pouvez modifier les propriétés (comportement) au moment de l’exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top