Що таке патерн Factory Method?
Factory Method (Фабричний метод) - це породжувальний патерн проєктування, який визначає інтерфейс для створення об'єктів, але дозволяє підкласам вирішувати, який саме клас інстанціювати. Тобто він делегує створення об'єктів дочірнім класам, звільняючи основний код від прив'язки до конкретних типів.
Навіщо потрібен
Без фабричного методу код часто напряму створює об'єкти через new, що робить систему негнучкою і важкою для розширення.
Factory Method відокремлює логіку створення від логіки використання, що дозволяє додавати нові типи продуктів без зміни клієнтського коду.
Структура
- Product (Продукт) - загальний інтерфейс для всіх створюваних об'єктів.
- ConcreteProduct - конкретні реалізації продукту.
- Creator (Творець) - оголошує фабричний метод, який повертає об'єкт
Product. - ConcreteCreator - перевизначає фабричний метод, створюючи потрібний тип продукту.
Приклад (Java)
// Продукт
interface Transport {
void deliver();
}
// Конкретні продукти
class Truck implements Transport {
public void deliver() {
System.out.println("Доставка суходолом");
}
}
class Ship implements Transport {
public void deliver() {
System.out.println("Доставка морем");
}
}
// Творець
abstract class Logistics {
abstract Transport createTransport();
public void planDelivery() {
Transport t = createTransport();
t.deliver();
}
}
// Конкретні творці
class RoadLogistics extends Logistics {
Transport createTransport() { return new Truck(); }
}
class SeaLogistics extends Logistics {
Transport createTransport() { return new Ship(); }
}Переваги
- Звільняє код від жорсткої залежності від конкретних класів.
- Спрощує розширення: можна додавати нові типи продуктів без зміни клієнтського коду.
- Підвищує тестованість і гнучкість.
Недоліки
- Збільшує кількість класів у проєкті.
- Вимагає успадкування, що не завжди зручно.
Підсумок: Factory Method - це спосіб перенести створення об'єктів із коду клієнта в підкласи, зберігши гнучкість і розширюваність архітектури.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.