8
votes

Quand est-il plus logique d'utiliser le motif d'usine plutôt qu'un constructeur surchargé pour instancier un objet?

in karl seguin's Fondations de Programmation Il existe une petite section sur l'utilisation du motif d'usine. Il ferme le passage en indiquant "Vous pouvez accomplir la même fonctionnalité avec surcharge constructeur", mais n'indique pas quand ou pourquoi?

Donc, quand est-il plus logique d'utiliser le motif d'usine plutôt qu'un constructeur surchargé pour instancier un objet?


1 commentaires

Dans la défense de Karl, il dit que le modèle d'usine offre une meilleure lisibilité, mais il utilise son "gut" et "goût" comme des facteurs déterminants.


7 Réponses :


2
votes

J'utilise une usine lorsque je veux que l'usine construit l'une de plusieurs sous-classes différentes (et je souhaite que l'appelant sache sur la classe de base, mais de ne pas connaître les sous-classes).


aussi, occasionnellement Je vais utiliser des méthodes statiques de la classe au lieu d'un constructeur surchargé, lorsque les différentes méthodes statiques prennent les mêmes types de paramètres (et donc les constructeurs ne peuvent donc pas être surchargés en fonction du type de paramètre uniquement). Voici un exemple artificiel: p>

Department
{
  //static factory methods
  public static Department createFromBoss(string bossName) { ... }
  public static Department createFromLocation(string locationName) { ... }
}


0 commentaires

4
votes

Si vous voulez avoir un couplage de lâche, l'usine a plus de sens, car vous pouvez simplement appeler l'usine de voiture, transmettre le SUV ENUM et la bonne classe est renvoyée. Votre application ne se soucie pas de la classe de la classe, tant qu'elle répond à vos besoins.


1 commentaires

Un objet qui accepte une usine comme argument est également responsable de l'appelant la méthode de la création.



0
votes

J'ai 1 situation dans laquelle une usine est utile. Je dois instancier un effet vidéo pour exécuter une vidéo. Selon le type de vidéo, l'effet vidéo a une classe de béton différente.

Si j'instire la classe de béton, je perds la possibilité d'ajouter plus d'effets vidéo plus tard sans modifier le code d'instanciation.

Lorsque j'ajoute plus d'effets vidéo, je n'ai que de modifier l'usine pour choisir la classe de béton appropriée.

Cela a-t-il un sens?


0 commentaires

0
votes

Il est peut-être que l'usine génère parfois des sous-types du type étant renvoyé. Vous ne pouviez pas faire cela avec un constructeur, mais avoir la flexibilité avec une usine.


0 commentaires

4
votes

Si vous faites Injection de dépendance mais nécessité de créer des instances de la dépendance nécessaire Au sein de la personne à charge, une option consiste à injecter une interface à une usine de classe. L'usine peut renvoyer une interface ou une classe abstraite. Cela fournit une flexibilité, une testabilité et un découplage au coût d'une certaine complexité.


1 commentaires

En effet, la construction virtuelle ne peut être réalisée sans une sorte d'usine / constructeur sur certaines langues (C ++)



1
votes

Je suis en désaccord avec sa déclaration. Différent constructeur est utilisé lorsque vous avez des méthodes différentes de construction / initialisation du constructeur. Le modèle d'usine est destiné à être utilisé lorsque les critères d'initialisation entraînent des objets différents à la construction.


0 commentaires

0
votes

Il est également logique d'utiliser le modèle d'usine pour utiliser des sous-classes, comme le montre Chrisw illustré, si vous souhaitez mettre en œuvre polymorphisme à travers vos méthodes. Si xxx

renvoie les différentes sous-classes de département, xxx

et xxx

Par exemple, cela pourrait prendre différentes actions, ce qui serait Messier si vous deviez essayer de fermer () un seul objet via une surcharge du constructeur.


0 commentaires