← Назад к вопросам

Что такое Абстрактная фабрика?

1.7 Middle🔥 181 комментариев
#ООП и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Абстрактная фабрика: паттерн проектирования

Abstract Factory — это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

Суть паттерна

Абстрактная фабрика решает проблему создания нескольких типов объектов, которые должны работать вместе. Вместо прямого создания объектов (new), мы используем фабрику, которая скрывает детали создания.

Пример: UI компоненты для разных платформ

// Абстрактные интерфейсы
abstract class Button {
  void render();
}

abstract class Checkbox {
  void render();
}

// iOS реализация
class IOSButton implements Button {
  @override
  void render() => print('iOS Button with rounded corners');
}

class IOSCheckbox implements Checkbox {
  @override
  void render() => print('iOS Checkbox with iOS style');
}

// Android реализация
class AndroidButton implements Button {
  @override
  void render() => print('Material Design Button');
}

class AndroidCheckbox implements Checkbox {
  @override
  void render() => print('Material Design Checkbox');
}

// Абстрактная фабрика
abstract class UIFactory {
  Button createButton();
  Checkbox createCheckbox();
}

// Конкретные фабрики
class IOSUIFactory implements UIFactory {
  @override
  Button createButton() => IOSButton();
  
  @override
  Checkbox createCheckbox() => IOSCheckbox();
}

class AndroidUIFactory implements UIFactory {
  @override
  Button createButton() => AndroidButton();
  
  @override
  Checkbox createCheckbox() => AndroidCheckbox();
}

// Использование
UIFactory factory;
if (Platform.isIOS) {
  factory = IOSUIFactory();
} else {
  factory = AndroidUIFactory();
}

final button = factory.createButton();
final checkbox = factory.createCheckbox();
button.render();
checkbox.render();

Преимущества

  • Отделение создания от использования — код не знает конкретные классы
  • Целостность семейств — гарантирует что используются согласованные объекты
  • Простота замены — легко переключаться между реализациями
  • Следование SOLID принципам — особенно Single Responsibility и Open/Closed

Недостатки

  • Усложнение кода — много новых классов и интерфейсов
  • Сложность для простых случаев — может быть overkill
  • Жёсткая иерархия — сложно добавлять новые типы объектов

Применение в Flutter

1. Темы приложения:

abstract class ThemeFactory {
  Color getPrimaryColor();
  Color getSecondaryColor();
  TextStyle getBodyTextStyle();
}

class LightThemeFactory implements ThemeFactory {
  @override
  Color getPrimaryColor() => Colors.blue;
  
  @override
  Color getSecondaryColor() => Colors.grey;
  
  @override
  TextStyle getBodyTextStyle() => TextStyle(color: Colors.black);
}

class DarkThemeFactory implements ThemeFactory {
  @override
  Color getPrimaryColor() => Colors.deepBlue;
  
  @override
  Color getSecondaryColor() => Colors.darkGrey;
  
  @override
  TextStyle getBodyTextStyle() => TextStyle(color: Colors.white);
}

2. Источники данных:

abstract class DataSourceFactory {
  Future<List<User>> getUsers();
  Future<void> saveUser(User user);
}

class ApiDataSourceFactory implements DataSourceFactory {
  @override
  Future<List<User>> getUsers() => apiClient.fetchUsers();
  
  @override
  Future<void> saveUser(User user) => apiClient.postUser(user);
}

class DatabaseDataSourceFactory implements DataSourceFactory {
  @override
  Future<List<User>> getUsers() => database.query('users');
  
  @override
  Future<void> saveUser(User user) => database.insert(user);
}

Отличие от Factory Method

Factory MethodAbstract Factory
Создаёт один тип объектаСоздаёт семейства объектов
Один методНесколько методов
SimplerБолее complex

Когда использовать

  • Система должна работать с несколькими семействами объектов
  • Нужна свобода выбора конкретной реализации
  • Нужна гарантия целостности семейств
  • Будут частые изменения реализаций

В контексте Clean Architecture

Абстрактная фабрика идеально подходит для создания repositories и data sources в layer взаимодействия.

Abstract Factory — мощный паттерн для масштабируемых приложений, где нужна гибкость и целостность создания связанных объектов.