Ответ
В Python, как и в других объектно-ориентированных языках, активно применяются различные паттерны проектирования для создания гибкого, расширяемого и поддерживаемого кода. Вот некоторые из часто используемых паттернов:
-
Singleton (Одиночка)
- Назначение: Гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему. Это полезно для объектов, которые должны быть уникальными в системе, например, менеджеры конфигурации, пулы соединений или логирование.
-
Пример реализации в Python (через
__new__
):class Singleton: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance # Использование: s1 = Singleton() s2 = Singleton() print(s1 is s2) # Выведет True
-
Factory Method (Фабричный метод)
- Назначение: Определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать. Это делегирует создание объектов подклассам, делая систему более гибкой к изменениям в типах создаваемых объектов.
-
Пример:
from abc import ABC, abstractmethod class Product(ABC): @abstractmethod def operation(self): pass class ConcreteProductA(Product): def operation(self): return "ConcreteProductA" class ConcreteProductB(Product): def operation(self):n return "ConcreteProductB" class Creator(ABC): @abstractmethod def factory_method(self) -> Product: pass def some_operation(self) -> str: product = self.factory_method() return f"Creator: {product.operation()}" class ConcreteCreatorA(Creator): def factory_method(self) -> Product: return ConcreteProductA() class ConcreteCreatorB(Creator): def factory_method(self) -> Product: return ConcreteProductB() # Использование: creator_a = ConcreteCreatorA() print(creator_a.some_operation()) # Выведет "Creator: ConcreteProductA"
-
Observer (Наблюдатель)
- Назначение: Определяет зависимость "один ко многим" между объектами так, что при изменении состояния одного объекта (субъекта) все его зависимые объекты (наблюдатели) автоматически уведомляются и обновляются. Используется для реализации распределенных систем событий.
-
Пример:
class Subject: def __init__(self): self._observers = [] def attach(self, observer): if observer not in self._observers: self._observers.append(observer) def detach(self, observer): self._observers.remove(observer) def notify(self, message): for observer in self._observers: observer.update(message) class Observer: def __init__(self, name): self.name = name def update(self, message): print(f"Observer {self.name} received: {message}") # Использование: subject = Subject() observer1 = Observer("One") observer2 = Observer("Two") subject.attach(observer1) subject.attach(observer2) subject.notify("State changed!") # Вывод: # Observer One received: State changed! # Observer Two received: State changed!
-
Decorator (Декоратор)
- Назначение: Динамически добавляет новую функциональность объекту, оборачивая его в другой объект. В Python часто реализуется с помощью функций-декораторов или классов-декораторов, что позволяет изменять поведение функций или методов без изменения их исходного кода.
-
Пример (функция-декоратор):
def log_execution(func): def wrapper(*args, **kwargs): print(f"Вызов функции '{func.__name__}' с аргументами: {args}, {kwargs}") result = func(*args, **kwargs) print(f"Функция '{func.__name__}' завершила работу. Результат: {result}") return result return wrapper @log_execution def add(a, b): return a + b @log_execution def multiply(a, b): return a * b # Использование: print(add(2, 3)) print(multiply(4, 5))
Помимо этих, в Python также широко используются другие паттерны, такие как:
- Adapter (Адаптер): Позволяет объектам с несовместимыми интерфейсами работать вместе.
- Strategy (Стратегия): Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
- Facade (Фасад): Предоставляет унифицированный интерфейс к набору интерфейсов в подсистеме, упрощая ее использование.
- Command (Команда): Инкапсулирует запрос как объект, позволяя параметризовать клиентов с различными запросами, ставить запросы в очередь или логировать их, а также поддерживать отмену операций.