Question

Est-il judicieux d'utiliser les interfaces pour les fabriques d'objets de domaine par défaut ou les interfaces doivent-elles être réservées pour les classes d'usine uniquement lorsque vous en avez besoin?

public IUserFactory
{
    User CreateNewUser();
}

public UserFactory : IUserFactory
{
    public User CreateNewUser()
    {
        return new User();
    }
}
Était-ce utile?

La solution

Voici une traduction du même problème en Java.

Exemple d'origine

public interface UserFactoryIF
{
   User createNewUser();
}

Ensuite, la mise en œuvre de la fabrique

public class UserFactory implements UserFactoryIF
{
     public User createNewUser()
     {
         // whatever special logic it takes to make a User
         // below is simplification
         return new User();
     }
}

Je ne vois aucun avantage particulier à définir une interface pour l’usine, car vous définissez une interface unique pour un producteur centralisé. En général, je constate que je dois produire de nombreuses implémentations différentes du même type de produit et que mon usine doit consommer de nombreux types de paramètres. C'est-à-dire que nous pourrions avoir:

public interface User
{
    public String getName();
    public long getId();
    public long getUUID();
    // more biz methods on the User
}

L'usine ressemblerait à ceci:

public class UserFactory {

    public static User createUserFrom(Person person) {
        // ...
        return new UserImpl( ... );
    }

    public static user createUserFrom(AmazonUser amazonUser) {
         // ... special logic for AmazonWS user
        return new UserImpl( ... );          
    }

    private static class UserImpl implements User {
       // encapsulated impl with validation semantics to
       // insure no one else in the production code can impl
       // this naively with side effects
    }
}

J'espère que cela passe le message.

Autres conseils

Dans votre exemple, je ne vois même pas pourquoi vous devez aller chez Factory.

  

L'essence du modèle d'usine est   "Définir une interface pour la création   un objet, mais laissez les sous-classes   décider quelle classe instancier. le   La méthode factory permet à une classe de différer   instanciation en sous-classes. " - Wikipedia

Avez-vous un type d'utilisateur différent, ou l'utilisateur est-il lui-même un type de quelque chose? Peut-être que vous n'avez pas expliqué la chose clairement. Nous utilisons généralement interface dans le modèle de méthode de fabrique abstraite , dans lequel nous devons traiter plusieurs familles d’objets apparentés.

NOTE: N'oubliez pas, les modèles sont là pour nous aider, cela ne signifie pas que nous devons les utiliser car ils sont disponibles, que nous en ayons besoin ou non.

Tout n’a pas nécessairement une interface; si vous avez une seule implémentation de quelque chose et aucune raison d’en avoir une autre, je ne vois pas pourquoi définir une interface.

Deux choses: (1) j'attendais avant de créer l'interface et (2) les interfaces facilitaient presque toujours les tests unitaires, en particulier pour les simulacres. Je viens souvent avec le besoin d’une interface immédiate.

La création d’une fabrique à partir d’une interface facilite beaucoup plus l’essai des classes simulées et simplifie l’utilisation des applications IoC. Ainsi, même si je n’en ai pas nécessairement besoin pour la fonctionnalité de l’application, je construis et appelle généralement la plupart des applications. des classes à travers des interfaces.

Si vous n'envisagez pas les tests unitaires ou les modèles IoC (à l'exception des opinions religieuses), je ne m'en soucierais probablement pas.

Je trouve que le principal problème avec leur utilisation, du moins dans Visual Studio, est que "Aller à la définition" d'une propriété ou d'une fonction passe à la définition d'interface, pas à la définition de classe.

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