Назад к вопросам
Middle
107
questionbank
Что такое паттерн 'Фабрика' в контексте разработки на PHP?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Паттерн "Фабрика" (Factory Method) — это порождающий паттерн проектирования, который предоставляет интерфейс для создания объектов в суперклассе, но делегирует создание объектов на подклассы. Это позволяет подклассам решать, какой класс будет создан.
Основные компоненты паттерна:
- Интерфейс/Абстрактный класс продукта (Product): Определяет интерфейс объектов, создаваемых фабричным методом.
<?php // Product Interface interface Product { public function operation(): string; } - Конкретные продукты (Concrete Products): Реализуют интерфейс продукта.
<?php // Concrete Product A class ConcreteProductA implements Product { public function operation(): string { return "Result of ConcreteProductA"; } } // Concrete Product B class ConcreteProductB implements Product { public function operation(): string { return "Result of ConcreteProductB"; } } - Интерфейс/Абстрактный класс создателя (Creator): Объявляет фабричный метод, который возвращает объект продукта. Может также содержать код, который использует продукт, возвращаемый фабричным методом.
<?php // Creator Abstract Class abstract class Creator { // The factory method itself abstract public function factoryMethod(): Product; // Some business logic that might use the product public function someOperation(): string { $product = $this->factoryMethod(); return "Creator: I've just worked with " . $product->operation(); } } - Конкретные создатели (Concrete Creators): Переопределяют фабричный метод для возврата определенного экземпляра конкретного продукта.
<?php // Concrete Creator A class ConcreteCreatorA extends Creator { public function factoryMethod(): Product { return new ConcreteProductA(); } } // Concrete Creator B class ConcreteCreatorB extends Creator { public function factoryMethod(): Product { return new ConcreteProductB(); } }
Принцип работы: Клиентский код работает с абстрактным создателем, вызывая его методы, которые, в свою очередь, используют фабричный метод для получения экземпляра нужного продукта. При этом клиент не знает, какой конкретный продукт создан.
Преимущества:
- Гибкость: Позволяет добавлять новые типы продуктов без изменения клиентского кода.
- Отделение ответственности: Разделяет код создания объектов от кода, использующего эти объекты.
- Расширяемость: Упрощает расширение системы новыми типами объектов.
Сценарии использования:
- Когда класс не может заранее предсказать тип объектов, которые он должен создать.
- Когда подклассы должны определять, какие объекты создавать.
- Когда необходимо предоставить возможность создания семейств связанных объектов.
Пример использования:
<?php
// Client code
function clientCode(Creator $creator)
{
echo "Client: I'm not aware of the creator's class, but it still works.<br>\n"
. $creator->someOperation() . "<br>\n";
}
echo "App: Launched with the ConcreteCreatorA.<br>\n";
clientCode(new ConcreteCreatorA());
echo "<br>\n";
echo "App: Launched with the ConcreteCreatorB.<br>\n";
clientCode(new ConcreteCreatorB());