Ответ
Фабричный метод (паттерн Factory Method) предназначен для создания объектов без указания их конкретных классов. Он может возвращать объекты различных типов, что является его главной силой.
Основные варианты возвращаемого типа:
-
Абстрактный класс или интерфейс (наиболее часто)
- Фабрика возвращает абстракцию, скрывая конкретную реализацию. Это основа принципа инверсии зависимостей (DIP).
public interface Transport { void deliver(); } public class Truck implements Transport { /*...*/ } public class Ship implements Transport { /*...*/ }
public abstract class Logistics { // Фабричный метод public abstract Transport createTransport(); public void planDelivery() { Transport t = createTransport(); // Возвращает Truck или Ship t.deliver(); } }
- Фабрика возвращает абстракцию, скрывая конкретную реализацию. Это основа принципа инверсии зависимостей (DIP).
-
Конкретный класс
- Используется, когда нужно инкапсулировать сложную логику создания одного типа объекта (например, используя Builder внутри).
-
Примитив или
String(редко)- Может применяться, если фабрика инкапсулирует логику вычисления простого значения.
Почему это важно?
- Слабосвязанная архитектура: Клиентский код зависит от интерфейса (
Transport), а не от классовTruckилиShip. - Гибкость и расширяемость: Добавление нового типа продукта (
Plane) требует лишь создания нового конкретного создателя, не затрагивая существующий клиентский код. - Соблюдение принципа открытости/закрытости (OCP): Код открыт для расширения (новых продуктов), но закрыт для модификации.
Таким образом, тип возвращаемого значения определяет уровень абстракции, который фабрика предоставляет клиенту.