Этот вопрос проверяет знание основных паттернов проектирования и понимание их применения для решения стандартных задач в разработке.
Паттерны проектирования — это проверенные временем шаблоны решения типичных задач. Они делятся на три основные категории:
Порождающие (например, Singleton, Factory, Builder).
Структурные (например, Adapter, Decorator, Proxy).
Поведенческие (например, Observer, Strategy, Command).
Паттерны проектирования помогают разработчикам решать типичные задачи, создавая гибкую и понятную архитектуру. Они делятся на три категории:
Используются для создания объектов, избегая жесткой привязки к конкретным классам.
Singleton: гарантирует существование единственного экземпляра класса.
Factory Method: предоставляет интерфейс для создания объектов в подклассах.
Builder: позволяет пошагово создавать сложные объекты.
Пример:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# Проверка работы
singleton_1 = Singleton()
singleton_2 = Singleton()
print(singleton_1 is singleton_2) # TrueОрганизуют классы и объекты для построения масштабируемых систем.
Adapter: приводит интерфейс одного класса к виду, совместимому с другим.
Decorator: добавляет новую функциональность объекту без изменения его структуры.
Proxy: предоставляет заменитель для другого объекта.
Пример:
class OldSystem:
def old_method(self):
return "Данные из старой системы"
class Adapter:
def __init__(self, old_system):
self.old_system = old_system
def new_method(self):
return self.old_system.old_method()
# Использование
old_system = OldSystem()
adapter = Adapter(old_system)
print(adapter.new_method()) # Данные из старой системыОписывают взаимодействие между объектами и классами.
Observer: уведомляет подписчиков об изменении состояния объекта.
Strategy: определяет семейство алгоритмов и позволяет динамически их изменять.
Command: инкапсулирует запрос в объект, позволяя параметризовать методы.
Пример:
class Subject:
def __init__(self):
self._observers = []
def add_observer(self, observer):
self._observers.append(observer)
def remove_observer(self, observer):
self._observers.remove(observer)
def notify_observers(self, message):
for observer in self._observers:
observer.update(message)
class Observer:
def update(self, message):
print(f"Получено уведомление: {message}")
# Использование
subject = Subject()
observer_1 = Observer()
observer_2 = Observer()
subject.add_observer(observer_1)
subject.add_observer(observer_2)
subject.notify_observers("Обновление данных")
# Получено уведомление: Обновление данных
# Получено уведомление: Обновление данныхПонимание этих паттернов помогает строить надежное ПО, упрощает поддержку и развитие приложений.