Назад к вопросам
Middle
89
questionbank

Какие паттерны программирования вам известны?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Известны порождающие, структурные и поведенческие паттерны.

Порождающие паттерны:

  • Фабричный метод (Factory Method): Предоставляет интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
    # Пример Фабричного метода
    class Creator:
        def factory_method(self):
            raise NotImplementedError()
    
        def some_operation(self):
            product = self.factory_method()
            return f"Creator: The same creator's code has just worked with {product.operation()}"
    
    class ConcreteCreator1(Creator):
        def factory_method(self):
            return ConcreteProduct1()
    
    class ConcreteProduct1:
        def operation(self):
            return "{Result of the ConcreteProduct1}"
    
  • Абстрактная фабрика (Abstract Factory): Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
  • Одиночка (Singleton): Гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему.
    # Пример Одиночки
    class SingletonMeta(type):
        _instances = {}
    
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                instance = super().__call__(*args, **kwargs)
                cls._instances[cls] = instance
            return cls._instances[cls]
    
    class Singleton(metaclass=SingletonMeta):
        pass
    
  • Строитель (Builder): Позволяет пошагово создавать сложные объекты, отделяя процесс конструирования от представления.
  • Прототип (Prototype): Позволяет создавать копии существующих объектов, не вдаваясь в подробности их реализации.

Структурные паттерны:

  • Адаптер (Adapter): Позволяет объектам с несовместимыми интерфейсами работать вместе.
    # Пример Адаптера
    class Target:
        def request(self):
            return "Target: The default target's behavior."
    
    class Adaptee:
        def specific_request(self):
            return ".eetpadA eht fo roivaheb laicepS"
    
    class Adapter(Target, Adaptee):
        def request(self):
            return f"Adapter: (TRANSLATED) {self.specific_request()[::-1]}"
    
  • Мост (Bridge): Разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо друг от друга.
  • Компоновщик (Composite): Позволяет компоновать объекты в древовидные структуры для представления иерархий от частного к целому.
  • Декоратор (Decorator): Динамически добавляет объектам новые обязанности.
  • Фасад (Facade): Предоставляет унифицированный интерфейс к группе подсистем.
  • Приспособленец (Flyweight): Позволяет использовать множество мелких объектов, эффективно их разделяя.
  • Заместитель (Proxy): Предоставляет суррогат или заполнитель для другого объекта, чтобы контролировать доступ к нему.

Поведенческие паттерны:

  • Цепочка обязанностей (Chain of Responsibility): Позволяет передавать запросы последовательно по цепочке обработчиков.
  • Команда (Command): Превращает запрос в объект, позволяя параметризовать клиенты с различными запросами, ставить запросы в очередь или логировать их, а также поддерживать отмену операций.
    # Пример Команды
    class Command:
        def execute(self):
            pass
    
    class SimpleCommand(Command):
        def __init__(self, payload):
            self._payload = payload
    
        def execute(self):
            print(f"SimpleCommand: See, I can do simple things like printing ({self._payload})")
    
    class Invoker:
        _on_start = None
        _on_finish = None
    
        def set_on_start(self, command):
            self._on_start = command
    
        def set_on_finish(self, command):
            self._on_finish = command
    
        def do_something_important(self):
            if isinstance(self._on_start, Command):
                self._on_start.execute()
    
            print("Invoker: Doing something really important.")
    
            if isinstance(self._on_finish, Command):
                self._on_finish.execute()
    
  • Итератор (Iterator): Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления.
  • Посредник (Mediator): Определяет объект, который инкапсулирует способ взаимодействия набора объектов.
  • Хранитель (Memento): Позволяет сохранять и восстанавливать внутреннее состояние объекта без нарушения инкапсуляции.
  • Наблюдатель (Observer): Определяет зависимость один ко многим между объектами, так что при изменении состояния одного объекта все зависящие от него оповещаются и автоматически обновляются.
  • Состояние (State): Позволяет объекту изменять свое поведение в зависимости от внутреннего состояния.
  • Стратегия (Strategy): Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
    # Пример Стратегии
    class Strategy:
        def do_algorithm(self, data):
            pass
    
    class ConcreteStrategyA(Strategy):
        def do_algorithm(self, data):
            return sorted(data)
    
    class Context:
        def __init__(self, strategy):
            self._strategy = strategy
    
        def set_strategy(self, strategy):
            self._strategy = strategy
    
        def do_some_business_logic(self):
            data = ["a", "b", "c", "d", "e"]
            result = self._strategy.do_algorithm(data)
            print(",".join(result))
    
  • Шаблонный метод (Template Method): Определяет скелет алгоритма в суперклассе, оставляя подклассам возможность переопределять некоторые шаги алгоритма без изменения его структуры.
  • Посетитель (Visitor): Позволяет добавлять новые операции к набору объектов без изменения кода этих объектов.

Также известны более специфичные паттерны, такие как Model-View-Controller (MVC), Model-View-Presenter (MVP), Model-View-ViewModel (MVVM) и другие архитектурные паттерны.