Паттерны Factory и Strategy - это два известных паттерна проектирования, которые широко используются в разработке программного обеспечения. Несмотря на то, что они оба используются для решения определенных задач, у них есть некоторые существенные различия, которые важно понять. В этом руководстве мы рассмотрим эти различия и узнаем, когда лучше использовать каждый паттерн.
Паттерн Factory (Фабрика)
Паттерн Factory используется для создания объектов без явного указания их конкретных классов. Он предоставляет интерфейс для создания объектов в суперклассе, а наследники могут решать, какой класс создавать.
Давайте рассмотрим пример использования паттерна Factory. Представим, что у нас есть класс Animal (Животное), и у нас есть несколько подклассов, таких как Cat (Кошка) и Dog (Собака). Мы хотим создать объекты этих подклассов, но не знаем, какой именно подкласс понадобится. В этом случае паттерн Factory становится полезным.
<?php
class Animal {
// Общие методы и свойства для всех животных
}
class Cat extends Animal {
// Реализация специфичных методов и свойств для кошек
}
class Dog extends Animal {
// Реализация специфичных методов и свойств для собак
}
class AnimalFactory {
public function createAnimal($type) {
if ($type === 'cat') {
return new Cat();
} elseif ($type === 'dog') {
return new Dog();
} else {
throw new Exception('Неизвестный тип животного.');
}
}
}
// Создание объектов с использованием паттерна Factory
$animalFactory = new AnimalFactory();
$cat = $animalFactory->createAnimal('cat');
$dog = $animalFactory->createAnimal('dog');
?>
В этом примере у нас есть классы Animal, Cat и Dog, а также класс AnimalFactory, который отвечает за создание объектов. Мы можем создать объекты Cat и Dog, вызвав метод createAnimal у объекта AnimalFactory и передавая ему тип животного ('cat' для кошки и 'dog' для собаки). Таким образом, мы можем создавать объекты без необходимости указывать их конкретные классы.
Паттерн Strategy (Стратегия)
Паттерн Strategy используется для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Он позволяет выбирать алгоритм во время выполнения программы.
Рассмотрим пример использования паттерна Strategy. Допустим, у нас есть класс Sort (Сортировка), который содержит различные алгоритмы сортировки, такие как Bubble Sort (Сортировка пузырьком) и Quick Sort (Быстрая сортировка). В зависимости от решаемой задачи, нам может понадобиться использовать разные алгоритмы сортировки. В этом случае паттерн Strategy очень полезен.
<?php
interface SortStrategy {
public function sort(array $data);
}
class BubbleSort implements SortStrategy {
public function sort(array $data) {
// Реализация сортировки пузырьком
}
}
class QuickSort implements SortStrategy {
public function sort(array $data) {
// Реализация быстрой сортировки
}
}
class Sorter {
private $strategy;
public function __construct(SortStrategy $strategy) {
$this->strategy = $strategy;
}
public function sort(array $data) {
return $this->strategy->sort($data);
}
}
// Использование паттерна Strategy для сортировки данных
$data = [4, 2, 1, 3];
$bubbleSorter = new Sorter(new BubbleSort());
$quickSorter = new Sorter(new QuickSort());
$bubbleSorter->sort($data); // Сортировка пузырьком
$quickSorter->sort($data); // Быстрая сортировка
?>
В этом примере у нас есть интерфейс SortStrategy и два класса: BubbleSort и QuickSort, которые реализуют этот интерфейс. У нас также есть класс Sorter, который использует паттерн Strategy для сортировки данных. Мы можем создавать объекты Sorter и передавать им нужные стратегии сортировки. В результате у нас есть гибкость выбирать алгоритм сортировки во время выполнения программы.
Когда использовать каждый паттерн?
Теперь, когда мы разобрали основы паттернов Factory и Strategy, рассмотрим, когда лучше использовать каждый из них.
Используйте паттерн Factory, когда вам нужно создать объекты без явного указания их конкретных классов. Фабрика позволяет делегировать создание объектов подклассам, что упрощает добавление новых типов объектов в систему и делает код более гибким.
Используйте паттерн Strategy, когда вам нужно инкапсулировать семейство алгоритмов, обеспечить их взаимозаменяемость и выбирать алгоритм во время выполнения программы. Стратегия позволяет легко добавлять новые алгоритмы и изменять их поведение, не изменяя код, использующий эти алгоритмы.
В заключение, использование паттернов Factory и Strategy может значительно улучшить архитектуру вашего программного обеспечения. Понимание различий между этими паттернами и умение выбирать подходящий в каждом конкретном случае поможет вам создавать более гибкий и модульный код.
Источники: