web-dev-qa-db-fra.com

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

Ayant enfin commencé sérieusement à essayer d'apprendre des motifs de base (très tard dans la carrière, mais c'est une autre histoire), j'essaie de comprendre les différences entre le motif d'usine et l'abstrait.

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 chacun.

40
Phil.Wheeler

méthode d'usine est généralement catégorisé par une instruction switch où chaque cas renvoie une classe différente, en utilisant la même interface racine afin que le code appelant n'ait jamais besoin de prendre de décisions concernant l'implémentation.

Pensez à une usine de validation 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");
    }
}

Abstract Factory est l'endroit où vous avez plusieurs classes d'usine concrètes (et non des méthodes d'usine) dérivées d'une interface qui peut 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 variantes de règles.

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, tout comme 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 modèle .

45
pdr