Quelle est la différence entre le motif d'usine et l'usine abstraite?

40

Ayant finalement commencé sérieusement à essayer d'apprendre certains motifs de base (très tard dans la carrière, mais c'est une histoire différente), j'essaie de comprendre les différences entre Factory Pattern et Abstract Factory.

Quelles sont les principales différences entre ces deux modèles?

Je comprends que la méthode Factory crée des objets par héritage et Abstract Factory le fait par la composition d’objets, mais d’un point de vue pratique, j’ai toujours du mal à visualiser exactement comment ils fonctionnent.

Phil.Wheeler
la source
2
Pour clarifier, voulez-vous dire "méthode d'usine" quand vous dites "modèle d'usine"? Si vous parlez des modèles Gang of Four, il n’existe pas de modèle Factory, mais il existe des méthodes Abstract Factory et Factory Method.
Thomas Owens
Oui - Méthode d'usine.
Phil.Wheeler
3
Pour être juste, les deux phrases semblent être assez communément échangées.
Phil.Wheeler
1
Ah, méthode d'usine. Une solution de contournement pour le fait que ce newn'est pas une méthode (dans certains systèmes - certes communs - d'objets).
Donal Fellows

Réponses:

44

La méthode d'usine est généralement classée dans une instruction switch dans laquelle chaque cas renvoie une classe différente, à l'aide de la même interface racine, de sorte que le code appelant n'a jamais à prendre de décision concernant l'implémentation.

Imaginez une usine de validateur de carte de crédit qui renvoie un validateur différent pour chaque type de carte.

public ICardValidator GetCardValidator (string cardType)
{
    switch (cardType.ToLower())
    {
        case "visa":
            return new VisaCardValidator();
        case "mastercard":
        case "ecmc":
            return new MastercardValidator();
        default:
            throw new CreditCardTypeException("Do not recognise this type");
    }
}

Dans Abstract Factory, vous disposez de plusieurs classes d’usines concrètes (et non de méthodes Factory) dérivées d’une interface unique, qui peuvent renvoyer de nombreux types différents à partir de méthodes différentes.

Pensez à un gestionnaire de jeu d'échecs avec une classe différente pour chaque ensemble de règles de variantes.

public class StandardChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class HexagonalChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new HexagonalChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new HexagonalChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class SpeedChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new SpeedChessMoveClock();
    }
}

Une usine abstraite, à la manière d'une stratégie, est souvent sélectionnée à l'aide d'une méthode d'usine, mais il n'est pas nécessaire de les combiner, c'est donc son propre motif.

pdr
la source
3
Cette explication de la méthode Factory est-elle correcte? "Le modèle de la méthode fabrique repose sur l’héritage, car la création d’objet est déléguée à des sous - classes qui implémentent la méthode fabrique pour créer des objets". Ainsi, l'exemple ressemble plus à Static Factory.
SerG
@SerG Eh bien, en toute justice, vous avez repris cette citation de Wikipedia, sur une page qui se lisait très différemment il y a trois ans. Je dirais que la page actuelle de Wikipédia se contredit à plusieurs endroits, mais je n’ai pas envie de participer à la sélection de celle-ci. Ce que je concéderais avec le recul, c’est que l’exemple que j’ai fourni ici est un type spécifique de méthode d’usine, connu sous le nom de méthode d’usine paramétrée. Mais le point concernant la différence entre Factory Method et Abstract Factory est valable pour tous les types de Factory Method.
pdr
2
La même déclaration que ma citation existe dans GoF "Design Patterns". Et la FM paramétrée y est également décrite.
SerG
L’important est que l’usine fournisse à l’appelant un objet approprié, en fonction de la situation, et l’appelant n’a pas besoin de savoir quelle est la classe exacte de cet objet ni de savoir comment l’objet en question a été choisi, à condition que l'objet prenne en charge une interface connue de l'appelant.
gnasher729
Vous devez indiquer clairement dans votre réponse que votre exemple n'est pas un modèle de méthode d'usine typique, mais une spécialisation nommée méthode d'usine paramétrée. Et écrivez à propos de la définition de la méthode d'usine typique, car elle est mal intégrée en ce moment. Je venais tout juste d'apprendre le modèle de méthode d'usine, j'ai tout compris, puis j'ai lu cette réponse qui montre le modèle de méthode d'usine comme quelque chose de différent et j'étais confus. Il n’existe aucune information indiquant que cet exemple n’est pas un modèle de méthode standard. Merci à SerG d'avoir signalé cela dans le commentaire.
ctomek