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()
}
}