Ответ
При выборе шаблона проектирования следует руководствоваться несколькими ключевыми критериями, чтобы решение было эффективным и оправданным.
-
Контекст и проблема. Соответствует ли шаблон решаемой задаче? Шаблон — это проверенное решение для типовой проблемы. Например, Factory Method используется, когда нужно делегировать создание объектов подклассам, а Singleton — когда требуется единственный экземпляр класса в системе.
-
Сложность и поддержка. Не усложнит ли шаблон код неоправданно? Иногда простое решение лучше, чем внедрение сложного паттерна, который будет трудно поддерживать (принципы KISS и YAGNI).
-
Гибкость и масштабируемость. Как шаблон повлияет на будущее развитие кода? Хороший выбор (например, Strategy или Decorator) позволяет добавлять новую функциональность, не изменяя существующий код.
-
Производительность. Некоторые шаблоны могут вносить дополнительную нагрузку (overhead). Например, Proxy добавляет уровень косвенности, что может незначительно сказаться на скорости выполнения.
Пример: выбор Singleton для логгера
Задача — обеспечить единую точку для логирования в приложении. Использование Singleton оправдано, так как он гарантирует, что все части системы будут работать с одним и тем же экземпляром логгера, избегая конфликтов и лишнего расхода ресурсов.
class Logger:
_instance = None
# __new__ вызывается перед __init__ для создания экземпляра
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
def log(self, message):
print(f"[LOG]: {message}")
# Все обращения вернут один и тот же объект
logger1 = Logger()
logger2 = Logger()
print(f"logger1 is logger2: {logger1 is logger2}") # -> True
logger1.log("Application started.")