Apa perbedaan antara pola pabrik dan pabrik abstrak?

40

Setelah akhirnya mulai serius mencoba mempelajari beberapa pola dasar (sangat terlambat dalam karier, tapi itu cerita yang berbeda), saya mencoba memahami perbedaan antara Pola Pabrik dan Pabrik Abstrak.

Apa perbedaan utama antara kedua pola ini?

Saya mengerti bahwa Metode Pabrik menciptakan objek melalui warisan dan Pabrik Abstrak melakukannya melalui komposisi objek, tetapi dari sudut pandang praktis, saya masih mengalami kesulitan memvisualisasikan bagaimana mereka bekerja.

Phil.Wheeler
sumber
2
Untuk memperjelas, apakah maksud Anda "Metode Pabrik" ketika Anda mengatakan "Pola Pabrik"? Jika Anda berbicara tentang pola Geng Empat, tidak ada Pola Pabrik, tetapi ada Pabrik Abstrak dan Metode Pabrik.
Thomas Owens
Ya - Metode Pabrik.
Phil.Wheeler
3
Agar adil, kedua frasa tersebut tampaknya cukup umum dipertukarkan.
Phil.Wheeler
1
Ah, Metode Pabrik. Sebuah solusi untuk fakta yang newbukan metode (dalam beberapa - sistem objek yang diakui umum).
Donal Fellows

Jawaban:

44

The Pabrik Metode biasanya dikategorikan oleh pernyataan switch di mana setiap kasus mengembalikan kelas yang berbeda, menggunakan antarmuka akar yang sama sehingga kode panggilan tidak pernah perlu untuk membuat keputusan tentang pelaksanaan.

Pikirkan pabrik validator kartu kredit yang mengembalikan validator berbeda untuk setiap jenis kartu.

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

The Abstract Factory adalah di mana Anda memiliki beberapa kelas pabrik beton (bukan Metode Pabrik) berasal dari satu antarmuka yang dapat kembali berbagai jenis dari metode yang berbeda.

Pikirkan manajer permainan catur dengan kelas yang berbeda untuk setiap rangkaian aturan varian.

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

Pabrik Abstrak, sangat mirip dengan Strategi, sering dipilih menggunakan Metode Pabrik, tetapi tidak perlu menggabungkannya sehingga itu adalah polanya sendiri.

pdr
sumber
3
Apakah penjelasan metode Pabrik itu benar? Bagaimana dengan "Pola metode pabrik bergantung pada warisan, karena pembuatan objek didelegasikan ke subkelas yang menerapkan metode pabrik untuk membuat objek". Jadi contohnya lebih seperti Pabrik Statis.
SerG
@SerG Ya, adil, Anda telah mengambil kutipan dari Wikipedia, pada halaman yang membaca sangat berbeda tiga tahun lalu. Saya berpendapat bahwa halaman Wikipedia saat ini bertentangan dengan dirinya sendiri di beberapa tempat, tetapi saya tidak memiliki keinginan untuk terlibat dalam memilihnya. Apa yang saya akui, di belakang, adalah bahwa contoh yang saya berikan di sini adalah jenis spesifik Metode Pabrik, yang dikenal sebagai Metode Pabrik Parameter. Tetapi poin tentang perbedaan antara Metode Pabrik dan Pabrik Abstrak berlaku untuk semua jenis Metode Pabrik.
pdr
2
Pernyataan yang sama dengan kutipan saya ada di "Pola Desain" GoF. Dan Parameterized FM juga dijelaskan di sana.
SerG
Bagian yang penting adalah bahwa pabrik akan memberikan penelepon objek yang cocok, tergantung pada situasi tertentu, dan penelepon tidak perlu tahu apa sebenarnya kelas objek itu, dan tidak perlu tahu bagaimana objek tertentu dipilih, selama objek mendukung antarmuka yang diketahui oleh penelepon.
gnasher729
Anda harus menyatakan yang jelas dalam jawaban Anda bahwa contoh Anda bukan pola metode pabrik yang khas, tetapi beberapa spesialisasi yang disebut metode pabrik berparameterisasi. Dan menulis tentang definisi metode pabrik yang khas, karena itu menyesatkan sekarang. Saya baru belajar tentang pola metode pabrik, saya mengerti segalanya dan kemudian saya membaca jawaban yang menunjukkan pola metode pabrik sebagai sesuatu yang berbeda dan saya bingung. Tidak ada informasi tentang contoh itu tidak menjadi pola metode pabrik yang khas. Terima kasih kepada SerG untuk menunjukkan hal itu dalam komentar.
ctomek