Попереднього разу ми з вами розібрали шаблон програмування Будівельник. Cьогодні ми продовжимо огляд породжуючих патернів і розглянемо так званий Фабричний Метод (англ. Factory Method).

    Factory Method

    Схема Шаблону Фабричний Метод

    У цій статті я наведу:

    • означення Фабричного Методу
    • розберемо приклад
    • обговоримо коли застосовувати
    • плюси та мінуси патерна
    • і як завжди доцільність його застосування в мові Python

    ***

    Означення

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

    Іншими словами даний шаблон дозволяє класу відтерміновувати процес ініціації підкласам.

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

    В даному шаблоні задіяні наступні дійові особи:

    • Продукт (Product) – визначає базовий інтерфейс об’єктів, які ми створюватимемо абстрактним методом фабрики;
    • Конкретний Продукт (Concrete Product) – реалізує інтерфейс Product, іншими словами це конкретні об’єкти типу Product;
    • Фабрика (Factory) – базовий клас для конкретних фабрик, що містить фабричний метод; він визначає інтерфейс для конкретних фабрик;
    • Конкретна Фабрика (Concrete Factory) – імплементує інтерфейс Фабрики, унаслідує та перевизначає її фабричний метод таким чином, щоб цей новий метод створював об’єкти Конкретного потрібного Продукту.

    А тепер давайте до швидкого прикладу:

    Приклад

    Наведу коротенький приклад. Уявіть, що є два виробника іграшок. Іграшки пластикові різних форм: каченята, машинки, ляльки і т.д. Для виготовлення виробники обробляють спеціальний порошок для форм, створюють форми різних типів, і тоді заливають пластик у потрібні форми.

    Таким чином ФОРМА визначає клас іграшки: машинка, каченя і т.д. Процес обробки такий самий, але взалежності від того, яку форму підставити отримуємо різні іграшки.

    Якщо по ролях Фабричного Методу, то у даному прикладі маємо:

    • Продукт – це пластик;
    • Конкретний Продукт – це каченя, машинка, і т.д.;
    • Фабрика – це конвеєр з виготовлення іграшок;
    • Конкретна Фабрика – це форма для іграшки.

    Factory Method Example

    Плюси та коли використовувати

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

    Дану проблему можна вирішити використовуючи інтерфейси. Але з інтерфейса неможливо створити об’єкт. Власне в такій ситуації необхідні об’єкти можна створювати з допомогою патерна Фабричний Метод.

    Сильні сторони патерна:

    • Плюсом Фабричного Методу є те, що він може повертати той самий інстанс класу кілька разів, або навіть може повертати підклас замість об’єкта конкретного типу. Таким чином, як і що повернути – справа лише метода фабричного. Інкапсуляція у повній своїй красі.
    • Фабричний Метод робить дизайн вашої аплікації більш гнучким і лише трошки складнішим. Інші патерни зазвичай потребують нових класів, в той час як Фабричний Метод лише нової операції.

    Мінуси

    В даного шаблона є кілька обмежень:

    • Це необхідність створення об’єкта Фабрика (або ще називають Creator) для того, щоб створити будь-який продукт з допомогою фабричного методу.
    • Звичайно фабрика створена згідно даного шаблону не може виготовляти об’єктів з різними базовими класами. Усі мусять імплементувати однаковий інтерфейс. Для рішення даного обмеження рекомендую використовувати Абстрактну Фабрику натомість.

    Застосування в мові Python

    Знову ж таки наголошу, що даний патерн ніколи б не виник в середовищі програмування мови Python. Він, як і абстрактна фабрика, виник давніше, ще для обходу обмежень більш статичних мов програмування, як от C++.

    В таких динамічних мовах як Python фабрики насправді не є потрібними зазвичай, оскільки класи є самі об’єктами (як і все інше в пітоні) і можуть передаватися напряму як аргументи.

    Тому наведу приклади однієї і тієї ж програми двічі. Спочатку – класичний варіант згідно Фабричного Методу, а потім більш Pythonic вигляд:

    А тепер варіант, як би це написав я в мові Пітон, не знаючи нічого про патерни 😉 Цього разу без коментарів:

    ***

    Тепер ви знаєте ще один породжуючий шаблон програмування. Використовувати його чи ні – звичайно на ваш розсуд. Все залежить від конкретної ситуації, задачі, мови програмування. В будь-якому разі ваш рівень піднявся, адже шаблони вважаються класикою і більшість досвідчених програмістів принаймні теоретично знайомі із більшістю шаблонами.

    Наступного разу розберемо Прототип. Знайоме слово? 😉

    Ви пробували даний шаблон програмування Фабричний Метод на практиці? Маєте зауваження до даної статті – коментуйте!

    Хочете більше дізнатись про веб-розробку та навчитись створювати веб-сайти використовуючи мову Python та веб-фреймворк Django? Гляньте дану пропозицію: