Паттерн Фабрика в Python

Паттерн Фабрика в Python

Паттерн Фабрика (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). Он помогает разделить ответственность за создание объектов и позволяет легко расширять функциональность, не изменяя существующий код.


Карпов Ярослав

Автор статьи:

Обновлено:

09.06.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *