Различия между паттернами Factory и Strategy в ООП

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Шаблон «Фабрика» предназначен для централизованного создания объектов, закрывая за собой детали их создания и предоставляя новые экземпляры. В свою очередь, шаблон «Стратегия» дает возможность динамической смены алгоритмов в программе, предлагая различные реализации общего интерфейса для работы с клиентской частью кода.

Java
Скопировать код
// Пример шаблона «Фабрика»
public interface Vehicle { void start(); }
public class Car implements Vehicle { public void start() { /* Запускаем машину */ } }
public class Bike implements Vehicle { public void start() { /* Начинаем движение на велосипеде */ } }
public class VehicleFactory {
    public static Vehicle createVehicle(String type) {
        if ("car".equals(type)) return new Car();
        else if ("bike".equals(type)) return new Bike();
        throw new IllegalArgumentException("Неизвестный тип транспорта");
    }
}

// Пример шаблона «Стратегия»
public interface SortingStrategy { void sort(int[] data); }
public class QuickSort implements SortingStrategy { public void sort(int[] data) {/* Применяем быструю сортировку */} }
public class MergeSort implements SortingStrategy { public void sort(int[] data) {/* Применяем сортировку слиянием */} }
public class ArrayProcessor {
    private SortingStrategy sorter;
    public ArrayProcessor(SortingStrategy sorter) { this.sorter = sorter; }
    public void sortData(int[] data) { sorter.sort(data); }
}

Подробнее о шаблонах «Фабрика» и «Стратегия»

Стратегическая фабрика

Комбинируя подходы Фабрики и Стратегии, мы получаем уникальные преимущества в гибкости проектов. Например, RendererFactory может создать HighQualityRenderer или PerformanceRenderer, выбирая между ними в зависимости от текущей стратегии. Это сочетание дает преимущества и Фабрики, и Стратегии.

Динамические дуэты

Фабрики могут носить стратегический характер: к примеру, ConnectionPoolFactory может применять разные стратегии, вроде CachingStrategy, LoadBalancingStrategy или FailoverStrategy, адаптирующиеся под меняющиеся обстоятельства, включая нагрузку на систему и состояние сети.

Интерфейсно-ориентированные шаблоны

Как Фабрика, так и Стратегия придают предпочтение работе с интерфейсами, а не конкретными реализациями. Фабрика создает экземпляры, соответствующие одному интерфейсу, в то время как Стратегия работает через интерфейс, облегчая замену алгоритмов. Это увеличивает гибкость поддержки и минимизирует связность.

Практическое применение

В разработке пользовательского интерфейса WidgetFactory отвечает за создание Button, Checkbox и других элементов, тогда как LayoutStrategy определяет их расположение в соответствии с пользовательским опытом.

В области платежных систем разные типы PaymentProcessor, созданные с помощью Фабрики, могут применять различные SecurityStrategy для шифрования и защиты данных.

Власть полиморфизма

Адаптивные фабрики

Абстрактные фабрики, способные создавать целые семейства объектов, могут применять разные стратегии для адаптации процесса создания к определенной среде. Примерами могут служить WindowsButtonCreationFactory и LinuxButtonCreationFactory, предназначенные для создания UI-компонентов под конкретные платформы.

Гибкость шаблона «Стратегия»

«Стратегия» позволяет инкапсулировать поведение, предоставляя возможность его замены, чего нельзя достичь с использованием статических методов. Возможность менять стратегии без изменения кода критически важна для адаптации приложения к изменениям в реальном времени.

Адаптивность к изменениям

И Фабрика, и Стратегия облегчают адаптацию к изменениям благодаря модульному дизайну. Добавляя новые объекты в фабрики и пополняя набор стратегий, можно избежать необходимости переписывания существующего кода.

Визуализация

Представьте шаблон «Фабрика» как JourneyFactory:

Markdown
Скопировать код
**JourneyFactory:**
- "Для воздушного путешествия? ✈️ Вам подойдет самолет!"
- "Для сухопутной истории? 🚗 Попробуйте машину!"
- "Предпочитаете море? 🚢 Корабль будет идеальным выбором!"

А вот шаблон «Стратегия» в виде TravelStrategy:

Markdown
Скопировать код
**TravelStrategy:**
- "Хотите насладиться видами? 🏞 Предлагаем вам живописный маршрут! 🗺️"
- "Желаете прибыть побыстрее? 🏁 Для вас стратегия максимальной скорости! ⏱️"
- "Стараетесь избегать платных дорог? 💰 Воспользуйтесь стратегией обхода платных участков! 🛣️"
Markdown
Скопировать код
🏭 **Фабрика**: ВЫПОЛНИТ ваш запрос, предложив нужное транспортное средство.
🧠 **Стратегия**: ПРИСПОСОБИТСЯ к вашим потребностям, выбрав оптимальный маршрут.

Полезные материалы

  1. Шаблон "Фабричный метод" — подробное руководство по шаблону "Фабричный метод".
  2. Шаблон "Стратегия" в Java – Пример учебника | DigitalOcean — детальное изложение шаблона "Стратегия" с примерами на Java.
  3. Шаблон "Фабричный метод" в Java – GeeksforGeeks — подробные примеры использования шаблона "Фабрика" на Java.
  4. Шаблон "Фабрика" — объяснение различий между шаблонами "Фабрика" и "Стратегия".
  5. Шаблон "Фабричный метод" – Шаблоны проектирования (эпизод 4) – YouTube — наглядное видео, демонстрирующее шаблон "Фабричный метод".