2010-04-13 5 views
4

Il y avait un article ici: http://msdn.microsoft.com/en-us/library/Ee817667%28pandp.10%29.aspxExplorer le modèle Factory Design

La première partie de Tut mis en œuvre ce modèle avec des classes abstraites. La deuxième partie montre un exemple avec la classe Interface. Mais rien dans cet article n'explique pourquoi ce modèle utiliserait plutôt un résumé ou une interface.

Alors, quelle explication (avantages de l'un par rapport à l'autre) donneriez-vous? Pas en général mais pour ce motif précis.

Néanmoins, l'avantage bien connu de l'interface est un couplage lâche, alors pourquoi ne pas l'appliquer à ce modèle? Si non pourquoi tous les trucs de Microsoft utilisent des interfaces alors?

Je suis surpris par le manque de réponses. Il semble que les gens sachent comment faire les choses mais pas vraiment pourquoi.

+2

grand nom d'utilisateur lol – jaywon

Répondre

1

Si vous y pensez, une classe de base abstraite est comme une interface avec une implémentation partielle. Par conséquent, utilisez une classe de base abstraite si vous avez des fonctionnalités standard qui seront partagées par toutes les classes qui seront créées par l'usine. Si vous n'avez pas d'implémentation, utilisez simplement une interface.

+0

Une classe de base abstraite oblige également un constructeur et prend votre lien d'héritage. Ce n'est certainement pas la même chose qu'une interface avec une implémentation partielle! –

+0

En fait, dans le contexte d'un modèle d'usine c'est. L'implémentation va nécessiter au moins un constructeur par défaut. Mon point est que vous pouvez utiliser une classe de base abstraite ou une interface avec un modèle d'usine et vous utiliseriez la classe de base abstraite lorsque vous voulez une implémentation de base. –

1

Vous pensez à tort. Si vous utilisez une interface ou une classe abstraite, vous devez prendre une décision lors de la création de l'entité. Plus tard, lorsque vous déciderez de le construire, vous utiliserez un motif d'usine abstrait.

Ils montraient simplement qu'il pouvait gérer n'importe quelle forme d'abstraction. Une interface est généralement considérée comme "meilleure" car elle permet un couplage plus lâche en ne forçant pas un constructeur et en n'utilisant pas votre lien d'héritage. Cependant, il est également plus rare d'utiliser une usine pour renvoyer une interface, car généralement vous voulez donner aux utilisateurs la possibilité d'injecter leur propre interface, ce qui n'est pas traditionnellement le cas (

Il y a un avantage spécifique à utiliser des interfaces auxquelles je peux penser; vous pouvez implémenter deux interfaces différentes avec la même classe. Voici un exemple (assez stupide):

interface IProvideInfo { 
    string Get(); 
} 
interface IProvideConnectionString : IProvideInfo { } 
interface IProvideCurrentUserName : IProvideInfo { } 

class CurrentContextProvider : IProvideConnectionString, IProvideCurrentUserName { 
    string IProvideConnectionString.Get() { 
    return ConfigurationManager.ConnectionStrings["db"]; 
    } 
    string IProvideCurrentUserName.Get() { 
    return _currentUserName; 
    } 
    string _currentUserName; 
    public string SetCurrentUserName(string s) { 
    _currerntUserName = s; 
    } 
} 

public class InfoProviderFactory { 
    CurrentContextProvider _provider = new CurrentContextProvider() 
    public IProvideInfo GetProvider(string key) { 
    return _provider; 
    } 
} 
+0

L'avantage bien connu de l'interface est le couplage lâche, alors pourquoi ne pas l'appliquer à ce modèle? Si non pourquoi tous les trucs de Microsoft utilisent des interfaces alors? – user310291

+0

Si vous recherchez Microsoft pour les meilleures pratiques, vous ne cherchez pas vraiment au bon endroit. Certains de leurs trucs ne sont pas mauvais (les conseils de Patterns and Practices, ASP.Net MVC), la plupart est une évolution lente faite pour moderniser une variété de préoccupations héritées. L'avantage d'une classe abstraite est qu'elle prend en charge le modèle de modèle fréquemment utilisé avec les usines. Habituellement, avec les interfaces, vous voulez vous ouvrir à d'autres implémentations injectées lors de l'exécution que le modèle d'usine traditionnel ne prend pas en charge. –

Questions connexes