252 votes

Les Modèles de conception: l'Usine de vs méthode de Fabrique vs Abstrait Usine

Je lisais des modèles de conception à partir d'un site web

Là j'ai lu sur Factoy, l'Usine de la méthode et de l'Abrégé de l'usine, mais ils sont si confus, je ne suis pas clair sur la définition. Selon les définitions

L'usine Crée des objets sans s'exposer à l'instanciation de la logique du client et Renvoie à l'objet nouvellement créé par le biais d'une interface commune. Est une version simplifiée de la Méthode de Fabrique

L'usine de la Méthode Définit une interface pour créer des objets, mais laissez-les sous-classes de décider à quelle classe instancier et se Réfère à l'objet nouvellement créé par le biais d'une interface commune.

Résumé en Usine Offre une interface pour la création d'une famille d'objets liés, sans préciser explicitement leurs classes.

J'ai aussi regardé les autres stackoverflow threads concernant Abstract Factory vs Méthode de Fabrique, mais les diagrammes UML tiré à y faire ma compréhension encore pire.

Quelqu'un peut-il me dire

  1. Comment sont ces trois modèles différents les uns des autres?
  2. Quand à utiliser?
  3. Et aussi, si possible, la java des exemples relatifs à ces modèles?

360voto

Anders Johansen Points 2627

Tous les trois de l'Usine de types de faire la même chose: Ils sont une "smart constructeur".

Disons que vous voulez être en mesure de créer deux types de Fruits: Pomme, Orange.

Usine

L'usine est "fixe", que vous avez juste une mise en œuvre sans sous-classement. Dans ce cas, vous aurez une classe comme ceci:

class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }

}

Cas d'utilisation: la Construction d'une Pomme ou une Orange est un peu trop complexe à gérer dans le constructeur, soit.

Méthode De Fabrique

Usine méthode est généralement utilisée lorsque vous avez quelques génériques de traitement dans une classe, mais à faire varier le type de fruit que vous utilisez réellement. Donc:

abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..
    <bla bla bla>
  }
}

...alors vous pouvez réutiliser les fonctionnalités courantes en FruitPicker.pickFruit() par la mise en œuvre d'une méthode de fabrique en sous-classes:

class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }
}

Résumé De L'Usine

Résumé de l'usine est normalement utilisé pour des choses comme l'injection de dépendances/stratégie, ou si vous voulez être en mesure de créer toute une famille d'objets qui doivent être de "même nature", mais ont en commun certaines classes de base. Voici un vaguement de fruits liées exemple. Le cas d'utilisation ici est que nous voulons nous assurer que nous n'avons pas accidentellement utiliser un OrangePicker sur un Apple. Tant à nous obtenir nos Fruits et Sélecteur de la même usine, ils correspondent.

interface PlantFactory {

  Plant makePlant();

  Picker makePicker(); 

}

public class ApplePicker implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangePicker implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}

22voto

Ravi K Points 593

Usine - Usine Distincte de la classe pour créer des objets complexes.

Ex: FruitFactory classe pour créer un objet de Fruits

class FruitFactory{

public static Fruit getFruit(){...}

}

Méthode de fabrique - au Lieu de l'ensemble de la classe séparée pour l'usine, il suffit d'ajouter une méthode dans la classe elle-même comme une usine.

Ex:

Calendar.getInstance() (Java's Calendar)

Résumé de l'Usine de la Méthode - l'Usine de l'Usine

Ex: disons que nous voulons construire une usine pour les pièces d'ordinateur. Il y a donc plusieurs types d'ordinateurs Portables, de Bureau, de Serveur.

Donc, pour chaque ordinateur de type, nous avons besoin de l'usine. Nous créons donc un haut niveau de l'usine d'usines, comme ci-dessous

ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Maintenant ces 3 lui-même sont encore des usines. (Vous aurez affaire à PartFactory lui-même, mais sous le capot, il y aura la mise en œuvre basé sur ce que vous avez fournies dans le résumé de l'usine)

  Interface-> PartFactory. getComputerPart(String s), 
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Usage:
new ComputerTypeAbstractFactory().getFactory("Laptop").getComputerPart("RAM")

EDIT: modifié pour fournir exacte des interfaces pour le Résumé de l'Usine selon les objections dans les commentaires.

12voto

Siddharth Points 3828

Chaque modèle de conception prospère pour aider à s'assurer que les écrits, code de travail n'est pas touché. Nous savons tous qu'une fois que nous touchons code de travail, il y a des défauts dans les flux de travail existants, et des tests beaucoup plus doit être fait pour s'assurer que nous n'avons pas briser quoi que ce soit.

Un modèle de fabrique crée des objets en se basant sur les critères d'entrée, donc de s'assurer que vous n'avez pas besoin d'écrire du code comme si c'puis créer ce genre d'objet autre chose ce genre d'objet. Un bon exemple de ceci est un site de voyage. Un site de voyage ne peuvent fournir de déplacement (avion, train, bus) ou / et de fournir des hôtels ou / et de fournir de l'attraction touristique des paquets. Désormais, lorsqu'un utilisateur sélectionne ensuite, le site doit décider quels objets il a besoin pour créer. Faut-il seulement de créer le voyage ou à l'hôtel de l'objet.

Maintenant, si vous envisagez d'ajouter un autre site web pour votre portefeuille, et vous croyez que la base même être utilisé, par exemple, un site internet de covoiturage, qui est maintenant la recherche de l'acr et effectue des paiements en ligne, vous pouvez utiliser un résumé de l'usine à votre cœur. De cette façon, vous pouvez juste claquer en une usine de taxis et covoiturage.

Les deux de l'usine n'ont rien à voir les uns avec les autres, de sorte que son une bonne conception pour les garder dans différents de l'usine.

Espère que c'est clair maintenant. Étude sur le site web de nouveau en gardant cet exemple en tête, j'espère qu'il va aider. Et j'espère vraiment que j'ai représenté les modèles correctement :).

4voto

Rohit Jain Points 90368

Vous pouvez essayer ces liens qui donne assez élaboré description de ces modèles, et les autres aussi: -

Et je pense que le premier lien est ce que vous cherchez.

Ce post sur: - des Exemples de GoF Modèles de Conception sera également utile pour vous. Vous devriez certainement jeter un oeil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X