Привет! Сегодня разберем паттерн
Abstract Factory (Абстрактная фабрика) - мощный инструмент для создания семейств связанных объектов без привязки к конкретным типам.
Зачем это нужно:
Представьте, что вы разрабатываете приложение, которое должно работать с разными темами оформления (светлая/темная) или разными базами данных (SQLite/Realm).
Abstract Factory позволяет создавать согласованные наборы объектов, которые гарантированно работают вместе.
Как это работает в Swift:
В отличие от
Java/
C++, в
Swift нет абстрактных классов. Но мы можем использовать протоколы для той же цели.
Пример:
Абстрактные товары:
protocol Coffee {
func brew()
}
protocol Tea {
func steep()
}
Конкретные товары:
// Для итальянской кофейни
struct Espresso: Coffee {
func brew() {
print("Варим эспрессо")
}
}
struct ItalianTea: Tea {
func steep() {
print("Завариваем итальянский травяной чай")
}
}
// Для английской кофейни
struct Cappuccino: Coffee {
func brew() {
print("Готовим капучино")
}
}
struct EnglishTea: Tea {
func steep() {
print("Завариваем английский черный чай")
}
}
Абстрактная фабрика:
protocol CafeFactory {
func makeCoffee() -> Coffee
func makeTea() -> Tea
}
Конкретные фабрики:
struct ItalianCafeFactory: CafeFactory {
func makeCoffee() -> Coffee {
Espresso()
}
func makeTea() -> Tea {
ItalianTea()
}
}
struct EnglishCafeFactory: CafeFactory {
func makeCoffee() -> Coffee {
Cappuccino()
}
func makeTea() -> Tea {
EnglishTea()
}
}
Использование фабрики:
final class CafeOrder {
private let factory: CafeFactory
init(factory: CafeFactory) {
self.factory = factory
}
func prepareCoffeeOrder() {
let coffee = factory.makeCoffee()
coffee.brew()
}
func prepareTeaOrder() {
let tea = factory.makeTea()
tea.steep()
}
}
let italianOrder = CafeOrder(factory: ItalianCafeFactory())
italianOrder.prepareCoffeeOrder()
italianOrder.prepareTeaOrder()
let englishOrder = CafeOrder(factory: EnglishCafeFactory())
englishOrder.prepareCoffeeOrder()
englishOrder.prepareTeaOrder()
Преимущества:
- Изоляция кода от конкретных классов.
- Гарантия согласованности объектов.
- Легкое добавление новых вариаций.
- Упрощение тестирования.
Когда не стоит использовать:
- Если у вас только один вариант продуктов.
- Когда семейства объектов часто меняются.
- В простых приложениях без сложной архитектуры.
Вывод:
Abstract Factory - отличный выбор для сложных приложений, где важна согласованность и гибкость архитектуры. Главное преимущество: способность легко добавлять новые семейства объектов без изменения существующего кода.