Добавить объявление

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

Привет! Сегодня разберем паттерн 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 - отличный выбор для сложных приложений, где важна согласованность и гибкость архитектуры. Главное преимущество: способность легко добавлять новые семейства объектов без изменения существующего кода.
07.12.2025 33 520