Какие основные паттерны проектирования ООП применяются в Python

Ответ

В Python, как и в других ООП-языках, широко используются классические паттерны проектирования. Вот некоторые из наиболее популярных:

  1. Singleton (Одиночка) Гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему. Используется для управления общими ресурсами, например, подключением к базе данных или конфигурацией.

    class Singleton:
        _instance = None
    
        def __new__(cls, *args, **kwargs):
            if not cls._instance:
                cls._instance = super().__new__(cls)
            return cls._instance
  2. Factory Method (Фабричный метод) Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемых объектов. Это полезно, когда точный тип объекта неизвестен заранее.

    from abc import ABC, abstractmethod
    
    class Creator(ABC):
        @abstractmethod
        def factory_method(self):
            pass
    
    class ConcreteCreator(Creator):
        def factory_method(self):
            return ConcreteProduct()
  3. Decorator (Декоратор) Позволяет динамически добавлять новую функциональность объектам, не изменяя их исходный код. В Python часто реализуется через синтаксис декораторов (@) для логирования, кэширования или проверки прав доступа.

    def my_decorator(func):
        def wrapper(*args, **kwargs):
            print("Что-то происходит перед вызовом функции.")
            result = func(*args, **kwargs)
            print("Что-то происходит после вызова функции.")
            return result
        return wrapper
    
    @my_decorator
    def say_hello():
        print("Привет!")
  4. Observer (Наблюдатель) Создает механизм подписки, позволяя одним объектам (наблюдателям) следить и реагировать на события, происходящие в других объектах (субъектах).

    class Subject:
        def __init__(self):
            self._observers = []
    
        def attach(self, observer):
            self._observers.append(observer)
    
        def notify(self, message):
            for observer in self._observers:
                observer.update(message)

Выбор паттерна всегда зависит от конкретной архитектурной задачи.