Комментарии (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 Method | Abstract Factory |
|---|---|
| Создаёт один тип объекта | Создаёт семейства объектов |
| Один метод | Несколько методов |
| Simpler | Более complex |
Когда использовать
- Система должна работать с несколькими семействами объектов
- Нужна свобода выбора конкретной реализации
- Нужна гарантия целостности семейств
- Будут частые изменения реализаций
В контексте Clean Architecture
Абстрактная фабрика идеально подходит для создания repositories и data sources в layer взаимодействия.
Abstract Factory — мощный паттерн для масштабируемых приложений, где нужна гибкость и целостность создания связанных объектов.