Яка різниця між фабричним візерунком та абстрактним заводом?


40

Нарешті почавши серйозно намагатися вивчити деякі основні зразки (дуже пізно в кар’єрі, але це вже інша історія), я намагаюся обернути голову навколо відмінностей між «Фабричним зразком» та «Фабрикою абстрактних».

Які ключові відмінності між цими двома моделями?

Я розумію, що Фабричний метод створює об'єкти шляхом успадкування, а абстрактний Factory робить це через об'єктну композицію, але з практичної точки зору у мене все ще виникають труднощі уявити, як саме вони працюють.



2
Для уточнення, ви маєте на увазі "Фабричний метод", коли ви говорите "Фабричний шаблон"? Якщо ви говорите про зразки банди чотирьох, немає фабричного зразка, але є абстрактний заводський і фабричний метод.
Томас Оуенс

Так - заводський метод.
Phil.Wheeler

3
Якщо бути справедливим, ці дві фрази здаються досить часто взаємозамінними.
Phil.Wheeler

1
А, заводський метод. Вирішення того факту, що newце не метод (у деяких - загальноприйнятих - об'єктних системах).
Дональні стипендіати

Відповіді:


44

Фабричний метод , як правило , класифікуються за розподільчим заявою , де кожен випадок повертає інший клас, використовуючи той же самий кореневої інтерфейс , так що викликає код не повинен приймати рішення про реалізацію.

Придумайте фабрику валідатора кредитної картки, яка повертає різний валідатор для кожного типу картки.

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 , де у вас є кілька бетонних фабричних класів (НЕ фабричні методів) , отриманих з одного інтерфейсу , який може повертати безліч різних типів з різних методів.

Подумайте про менеджера шахових ігор з різним класом для кожного набору варіантів правил.

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

Абстрактна фабрика, подібно до стратегії, часто вибирається за допомогою заводського методу, але поєднувати їх не потрібно, щоб це був власний зразок.


3
Чи правильно це пояснення фабричного методу? Що стосується "Заводський шаблон методу покладається на спадкування, оскільки створення об'єкта делеговано підкласам, які реалізують заводський метод для створення об'єктів". Тож приклад більше нагадує статичну фабрику.
СерГ

@SerG Справедливо кажучи, ви зібрали цю цитату з Вікіпедії, на сторінці, яку читали зовсім інакше три роки тому. Я заперечую, що нинішня сторінка Вікіпедії суперечить собі в декількох місцях, але я не маю бажання брати участь у виборі цього. Що я б заздалегідь зізнався, - це те, що я подав тут приклад - це специфічний вид заводського методу, відомий як параметризований заводський метод. Але суть про різницю між Фабричним методом та Абстрактним Заводом дотримується всіх типів Фабричного методу.
пдр

2
Таке ж твердження, що і моя цитата, існує в GoF "Шаблони дизайну". І там також описаний Параметризований FM.
СерГ

Важлива частина полягає в тому, що фабрика надасть абоненту відповідний об'єкт, залежно від конкретної ситуації, і абоненту не потрібно знати, який саме клас цього об’єкта це, і не потрібно знати, як конкретний об'єкт було обрано, доки об'єкт підтримує інтерфейс, про який абонент знає.
gnasher729

Ви повинні сказати, що у своїй відповіді зрозуміло, що ваш приклад - це не типовий заводський шаблон, а певна спеціалізація, названа параметризованим заводським методом. І напишіть про визначення типового фабричного методу, оскільки це неправильно зараз. Я просто дізнався про заводський метод, я все зрозумів, а потім прочитав цю відповідь, яка показує заводський шаблон методу, як щось інше, і мене розгубило. Немає інформації про те, щоб цей приклад не був типовою схемою заводських методів. Дякуємо SerG за те, що він виклав це у коментарі.
ctomek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.