Pergunta

Será que faz sentido para as interfaces de uso para suas fábricas de objeto de domínio por padrão, ou deveria interfaces de ser reservados para as classes de fábrica somente quando você precisa deles?

public IUserFactory
{
    User CreateNewUser();
}

public UserFactory : IUserFactory
{
    public User CreateNewUser()
    {
        return new User();
    }
}
Foi útil?

Solução

Aqui está uma tradução do mesmo problema em Java.

exemplo Original

public interface UserFactoryIF
{
   User createNewUser();
}

Em seguida, a implementação da fábrica

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

Não vejo qualquer benefício especial para definir uma interface para a fábrica, desde que você está definindo uma interface única para um produtor centralizado. Normalmente eu acho que eu preciso para produzir muitas implementações diferentes da mesma espécie de produto, e minha fábrica precisa consumir muitos tipos diferentes de parâmetros. Ou seja, podemos ter:

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

A fábrica ficaria assim:

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
    }
}

Espero que este obtenha o ponto transversalmente.

Outras dicas

Em seu exemplo dado, eu nem vejo porque você precisa ir de fábrica.

A essência do padrão de fábrica é "definir uma interface para criar um objeto, mas deixa as subclasses decidir qual classe instanciar. o método de fábrica permite que um adiamento classe instanciação para subclasses." - Wikipedia

Você tem um tipo diferente de usuários, ou usuário é em si um tipo de coisa. Pode ser que você não deu mais detalhes a coisa claramente. Normalmente, usamos Interface em fábrica abstrata método padrão , onde temos de lidar com várias famílias de objetos relacionados.

NOTA:. Não se esqueça, os padrões estão lá para nos ajudar, isso não significa que devemos usá-los porque eles estão disponíveis, se precisamos ou não

Nem tudo tem de ter uma interface; se você tem uma única implementação de alguma coisa, e não há razão para ter qualquer outro que eu não posso ver porque definir uma interface.

Duas coisas: (1) Eu esperaria até que eu precisava (ou viu uma necessidade iminente) uma implementação alternativa antes de eu criar a interface e (2) interfaces quase sempre fazem a unidade de teste mais fácil, especialmente com zombando, assim Eu freqüentemente chegar a uma necessidade de uma interface imediatamente.

Criar a fábrica fora uma interface permite muito mais fácil para testá-los com aulas simuladas, bem como torná-lo mais simples de usar aplicações IoC, por isso, enquanto eu pode não necessariamente precisa deles para a funcionalidade do aplicativo, eu geralmente construir e chamar mais aulas através de interfaces.

Se você não está considerando testes de unidade ou padrões IoC (opiniões religiosas à parte), eu provavelmente não iria incomodar.

Acho que a maior dor com o uso deles, no Visual Studio, pelo menos, é que 'Go To Definition' em uma propriedade ou função vai para a definição de interface, não a definição de classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top