Перейти к основному содержимому

Паттерн "Абстрактная фабрика" (Abstract Factory) в Java — семейства совместимых клиентов

Разработчику Архитектору

Обзор — в порождающих паттернах. Здесь — практический Abstract Factory на Java для провайдеров уведомлений.

Загрузка редактора схем…

Задача паттерна

Abstract Factory создает семейства связанных объектов без привязки клиентского кода к конкретным классам.

Если система переключается между провайдерами целиком (AWS, Firebase), фабрика гарантирует, что все созданные клиенты совместимы между собой.


Пример — уведомления по провайдерам

interface EmailSender {
void send(String to, String message);
}

interface SmsSender {
void send(String phone, String message);
}

interface NotificationFactory {
EmailSender createEmailSender();
SmsSender createSmsSender();
}

class AwsEmailSender implements EmailSender {
@Override
public void send(String to, String message) {
System.out.println("AWS SES -> " + to);
}
}

class AwsSmsSender implements SmsSender {
@Override
public void send(String phone, String message) {
System.out.println("AWS SNS -> " + phone);
}
}

class AwsNotificationFactory implements NotificationFactory {
@Override
public EmailSender createEmailSender() {
return new AwsEmailSender();
}

@Override
public SmsSender createSmsSender() {
return new AwsSmsSender();
}
}
NotificationFactory factory = new AwsNotificationFactory();
EmailSender email = factory.createEmailSender();
SmsSender sms = factory.createSmsSender();

Клиенту не нужно знать детали AWS/Firebase классов.


Отличие от Factory Method

ПаттернЧто создаёт
Factory MethodОдин продукт
Abstract FactoryСемейство продуктов

Подробнее про Factory Method — 136.


Когда применять и минусы

Подходит, если нужны целые наборы совместимых компонентов (драйверы БД, UI-темы, облачные SDK).

Минус: добавить новый тип продукта (например, PushSender) сложно — нужно менять интерфейс фабрики и все ее реализации.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").