Паттерн Фабрика (Factory Pattern) — это один из порождающих паттернов проектирования, который позволяет создавать объекты, не специфицируя точный класс создаваемого объекта. Это как если бы у вас был «универсальный конструктор», который по команде строил бы нужные вам объекты.
Пример из реальной жизни
Представьте, что вы управляете кафе, и у вас есть различные типы напитков: кофе, чай и сок. Если каждый раз при заказе напитка вам нужно было бы указывать точный рецепт приготовления, вы бы быстро запутались. Вместо этого вы просто говорите бариста: «Один кофе, пожалуйста!» — и он сам знает, как его приготовить. Это и есть аналогия с паттерном Фабрика.
Реализация паттерна Фабрика в Python
Давайте рассмотрим, как можно реализовать паттерн Фабрика на языке Python.
Шаг 1: Создание базового класса продукта
Начнем с создания абстрактного класса для наших продуктов (напитков):
from abc import ABC, abstractmethod
class Drink(ABC):
@abstractmethod
def prepare(self):
pass
Шаг 2: Реализация конкретных продуктов
Теперь создадим конкретные классы напитков, которые наследуют наш базовый класс:
class Coffee(Drink):
def prepare(self):
return "Preparing a cup of coffee."
class Tea(Drink):
def prepare(self):
return "Preparing a cup of tea."
class Juice(Drink):
def prepare(self):
return "Preparing a glass of juice."
Шаг 3: Создание фабрики
Создадим фабрику, которая будет создавать наши напитки:
class DrinkFactory:
def create_drink(self, drink_type):
if drink_type == "coffee":
return Coffee()
elif drink_type == "tea":
return Tea()
elif drink_type == "juice":
return Juice()
else:
raise ValueError(f"Unknown drink type: {drink_type}")
Шаг 4: Использование фабрики
Теперь посмотрим, как использовать нашу фабрику для создания напитков:
if __name__ == "__main__":
factory = DrinkFactory()
drink = factory.create_drink("coffee")
print(drink.prepare())
drink = factory.create_drink("tea")
print(drink.prepare())
drink = factory.create_drink("juice")
print(drink.prepare())
Расширяемость и гибкость
Одно из главных преимуществ паттерна Фабрика — это его расширяемость. Допустим, вы хотите добавить новый тип напитка — какао. Вам не нужно изменять существующий код фабрики. Просто добавьте новый класс и обновите метод create_drink
:
class Cocoa(Drink):
def prepare(self):
return "Preparing a cup of cocoa."
class DrinkFactory:
def create_drink(self, drink_type):
if drink_type == "coffee":
return Coffee()
elif drink_type == "tea":
return Tea()
elif drink_type == "juice":
return Juice()
elif drink_type == "cocoa":
return Cocoa()
else:
raise ValueError(f"Unknown drink type: {drink_type}")
Теперь ваш код готов к созданию какао!
Паттерн Фабрика и принципы SOLID
Паттерн Фабрика прекрасно вписывается в принципы SOLID, особенно в принцип единственной ответственности (SRP) и принцип открытости/закрытости (OCP). Он помогает разделить ответственность за создание объектов и позволяет легко расширять функциональность, не изменяя существующий код.
Автор статьи:
Обновлено:
Добавить комментарий