Fabrika modeli ve soyut fabrika arasındaki fark nedir?


40

Sonunda bazı temel kalıpları öğrenmeye ciddi olarak başladıktan sonra (kariyerin çok geç, ama bu farklı bir hikaye), kafamı Fabrika Deseni ile Soyut Fabrika arasındaki farklar etrafında toplamaya çalışıyorum.

Bu iki model arasındaki anahtar farklar nelerdir?

Fabrika Metodunun kalıtım yoluyla nesneler yarattığını ve Soyut Fabrikanın bunu nesne kompozisyonu yoluyla yaptığını anlıyorum, ancak pratik bir bakış açısıyla, her birinin tam olarak nasıl çalıştığını görselleştirmekte zorlanıyorum.



2
Netleştirmek için, "Fabrika Deseni" derken "Fabrika Yöntemi" anlamına mı geliyorsunuz? Dört kalıp çetesinden bahsediyorsanız, Fabrika Deseni yoktur, ancak Soyut Fabrika ve Fabrika Yöntemi vardır.
Thomas Owens

Evet - Fabrika Yöntemi.
Phil.Wheeler

3
Adil olmak gerekirse, iki cümle oldukça yaygın olarak birbiriyle değiştirilmiş gibi görünüyor.
Phil.Wheeler

1
Ah, Fabrika Yöntemi. Bir newyöntem olmadığı gerçeği için geçici bir çözüm (bazı - kuşkusuz ortak - nesne sistemlerinde).
Donal Fellows,

Yanıtlar:


44

Fabrika Yöntemi genellikle her durumda çağıran kod uygulaması hakkında kararlar almak için ihtiyaç asla böylece aynı kök arayüzü kullanarak, farklı bir sınıf döndüren bir anahtar deyimi göre kategorize edilir.

Her kart türü için farklı bir onaylayıcı döndüren bir kredi kartı doğrulama 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");
    }
}

Özet Fabrika farklı yöntemlerle birçok farklı türde döndürebilir bir arayüz elde edilen çoklu beton fabrikası sınıfları (değil Fabrika Yöntemleri) olduğu yerden.

Her değişken türü için farklı bir sınıfa sahip bir satranç oyun menajeri 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();
    }
}

Bir Stratejiye çok benzeyen bir Soyut Fabrika, genellikle bir Fabrika Yöntemi kullanılarak seçilir, ancak bunları kendi kalıbı olması için birleştirmek gerekmez.


3
Fabrika yönteminin açıklaması doğru mu? “Fabrika yöntemi deseni mirasa dayanır, çünkü nesne oluşturma, nesne oluşturma için fabrika yöntemini uygulayan alt sınıflara verilir ”. Yani örnek Statik Fabrika gibi.
SerG

@SerG Adaletle, bu teklifi Wikipedia'dan üç yıl önce çok farklı bir şekilde okuyan bir sayfadan seçtiniz. Mevcut Wikipedia sayfasının birçok yerde kendisiyle çeliştiğini iddia ediyorum, ancak bunu ayırmada yer alma arzum yok. Karar vereceğim, burada verdiğim örneğin, Parametreli Fabrika Yöntemi olarak bilinen belirli bir Fabrika Yöntemi olduğu yönünde. Ancak Fabrika Yöntemi ile Soyut Fabrika arasındaki fark hakkındaki nokta, her türlü Fabrika Yöntemi için geçerlidir.
pdr

2
Alıntı yaptığım ifadenin aynısı GoF "Design Patterns" ta var. Ayrıca Parametrelenmiş FM de burada açıklanmaktadır.
SerG

Önemli olan, fabrikanın belirli bir duruma bağlı olarak arayan kişiye uygun bir nesne vereceği ve arayan kişinin o nesnenin sınıfının tam olarak ne olduğunu bilmesi ve belirli bir nesnenin nasıl olduğunu bilmesi gerekmemesidir. Arayanın bildiği bir arayüzü desteklediği sürece seçilmiştir.
gnasher729

Cevabınıza göre, örneğinizin tipik bir fabrika yöntemi kalıbı değil, parametreleştirilmiş fabrika yöntemi olarak adlandırılan bazı uzmanlık olduğunu belirtmelisiniz. Ve tipik fabrika yönteminin tanımını yazın, çünkü şu anda yanıltıcıdır. Sadece fabrika metodu modelini öğrendim, her şeyi anladım ve daha sonra fabrika metodu modelini farklı bir şey olarak gösteren cevabı okudum ve kafam karıştı. Bu örnek hakkında tipik fabrika yöntemi kalıbı olmadığı hakkında hiçbir bilgi yoktur. SerG'ye, yorumda bunu gösterdiği için teşekkür ederiz.
ctomek,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.