it-swarm-tr.com

Fabrika desen ve soyut fabrika arasındaki fark nedir?

Sonunda ciddi bazı temel kalıpları öğrenmeye çalışırken (kariyerin çok geç, ama bu farklı bir hikaye) başlayarak, Fabrika Deseni ve Soyut Fabrika arasındaki farkları araştırmaya çalışıyorum.

Bu iki örüntü arasındaki temel farklar nelerdir?

Fabrika Metodunun miras yoluyla nesneler yarattığını anlıyorum ve Soyut Fabrika bunu nesne kompozisyonu aracılığıyla yapıyor, ancak pratik bir bakış açısıyla, her birinin nasıl çalıştığını tam olarak görselleştirmekte hala sorun yaşıyorum.

40
Phil.Wheeler

Fabrika Metod genellikle, her bir durumun aynı kök arabirimini kullanarak farklı bir sınıf döndürdüğü bir anahtar ifadesi ile kategorize edilir, böylece çağrı kodunun uygulama hakkında karar vermesi gerekmez.

Her kart türü için farklı bir doğrulayıcı döndüren bir kredi kartı doğrulayıcı fabrikasını düşünün.

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, farklı yöntemlerden birçok farklı tür döndürebilen bir arayüzden türetilen birden fazla beton fabrika sınıfına (Fabrika Yöntemleri değil) sahip olduğunuz yerdir.

Her bir varyant kuralı seti için farklı bir sınıfa sahip bir satranç oyunu yöneticisi düşünün.

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();
    }
}

Soyut bir Fabrika, tıpkı bir Strateji gibi, bir Fabrika Yöntemi kullanılarak sık sık seçilir, ancak bunları birleştirmek gerekli değildir, bu yüzden kendi kalıbıdır .

45
pdr