Sobes.tech
Middle
102
questionbank

Что такое паттерн проектирования 'Фабрика' и как он используется в разработке приложений?

Ответ от нейросети

sobes.tech AI

Паттерн 'Фабрика' (Factory Method) — это порождающий паттерн, который определяет интерфейс для создания объекта, но позволяет подклассам решать, какой именно класс инстанциировать. Метод создания объекта вынесен в отдельный "фабричный" метод.

Используется в разработке приложений для:

  • Инкапсуляции логики создания объектов: Клиентский код не зависит от конкретных классов создаваемых объектов.
  • Расширяемости: Легко добавлять новые типы объектов, не меняя клиентский код, достаточно создать новый подкласс фабрики.
  • Полиморфизма: Позволяет работать с различными подтипами объектов единообразно через общий интерфейс.

Пример использования в Android:

  • Создание View Holden в RecyclerView.Adapter: onCreateViewHolder — это по сути фабричный метод, который возвращает конкретный ViewHolder.
// Интерфейс продукта
interface Transport {
    void deliver();
}

// Конкретный продукт 1
class Truck implements Transport {
    @Override
    public void deliver() {
        // Логика доставки на грузовике
    }
}

// Конкретный продукт 2
class Ship implements Transport {
    @Override
    public void deliver() {
        // Логика доставки на корабле
    }
}

// Абстрактная фабрика
abstract class Logistics {
    public void planDelivery() {
        Transport t = createTransport(); // Фабричный метод
        t.deliver();
    }

    // Абстрактный фабричный метод, который должны реализовать подклассы
    abstract Transport createTransport();
}

// Конкретная фабрика 1 для наземной логистики
class RoadLogistics extends Logistics {
    @Override
    Transport createTransport() {
        return new Truck();
    }
}

// Конкретная фабрика 2 для морской логистики
class SeaLogistics extends Logistics {
    @Override
    Transport createTransport() {
        return new Ship();
    }
}

// Клиентский код
class App {
    public static void main(String[] args) {
        Logistics roadLogistics = new RoadLogistics();
        roadLogistics.planDelivery(); // Создаст Truck и вызовет deliver()

        Logistics seaLogistics = new SeaLogistics();
        seaLogistics.planDelivery(); // Создаст Ship и вызовет deliver()
    }
}