2009-09-15 9 views
7

Je me demandais s'il y avait un motif opposé du modèle d'usine. Par exemple, lorsqu'un objet particulier doit être supprimé, un travail supplémentaire doit être effectué pour annuler la configuration effectuée dans l'objet usine.Quel motif de conception est à l'opposé du motif Usine?

L'extension de l'objet usine avec une méthode Delete par exemple semble incorrecte, car le motif d'usine est un modèle de création strict.

Mise à jour: La raison pour laquelle j'utilise une fabrique est que la configuration qui doit être faite introduirait des dépendances à l'objet qui ne rentreraient pas. Mettre cette déconfiguration dans le constructeur poserait le même problème.

+2

Que voulez-vous dire par «supprimer»? Libérer de la mémoire ou supprimer d'une banque de données? –

+0

Avec la suppression je voulais dire le retirer d'un magasin de données, ce serait fait par le référentiel. –

+0

et quel type de "configuration a été effectuée dans l'objet usine"? Un objet doit être capable de nettoyer après lui-même, la tâche des destructeurs et/ou disposer. Je dirais qu'une usine ne devrait rien savoir des objets qu'elle a créés. –

Répondre

3

C'est la bonne façon d'utiliser l'usine. Factory n'est pas seulement un moyen de créer des objets, mais aussi de dire: j'ai besoin d'une initialisation spéciale pour ce genre d'objets. Avec votre problème, je pense que la meilleure solution serait de notifier l'usine avec un événement, comme disposé. Ainsi, la création de votre objet se fera de la manière suivante: créer, souscrire l'usine à l'événement de l'objet nouvellement créé. Chaque fois que l'objet est supprimé, vous en informerez l'usine et effectuerez les actions dont vous avez besoin.

Si vous n'aimez pas mettre cela en usine, vous pouvez le déléguer à un autre type d'objet, comme DeathKeeper ;-). Ainsi, votre code ressemblera sometihng comme ceci:

//Inside factory create method 
MyObject obj = GetNewInitializedObject(); 
_detahKeeper.RegisterObject(obj); 

return obj; 

Maintenant, chaque fois que vous devez supprimer l'objet, votre objet avertira gardien de la mort et il serait toute logique Éliminez. En passant, je ne sais pas comment tout cela fonctionne, mais vous pouvez utiliser l'interface IDisposable pour faire la logique personnalisée pour disposer des ressources détenues par l'objet. La décision dépend de ce qu'il y a dans votre projet et dépend de vous.

4

Un référentiel peut être utilisé pour supprimer un objet persistant ou vous pouvez utiliser la méthode dispose pour effectuer un nettoyage sur un objet en mémoire uniquement.

+0

Je vais mettre cette "déconfiguration" dans le dépôt pour le moment. –

+0

Avez-vous besoin de détruire toute information persistante (base de données/fichier)? –

2

J'utilise un modèle « installation de recyclage » travaillant en tandem avec l'usine: méthode

  • ont un « propre » pour chaque classe qui peut être recyclé
  • ont un « identifiant unique » pour chaque objet par exemple

Chaque fois qu'un objet atteint sa fin de vie, l'envoyer à la « facilité de recyclage » (RF):

  • Le RF stocke l'objet selon une politique (par ex. ne garder que les instances de X de la classe Y)
  • Lorsqu'une instance de la classe Y est nécessaire, l'usine de « demande » RF si son obtenu un
    • si le RF a une portée de main, le RF appelle le « propre() » méthode sur l'instance et il retourne à l'usine

... et ainsi de suite ainsi de suite.

Espérons que cela aide.

Questions connexes