Шаблонный метод - определяет скелет алгоритма в базовом классе, позволяя подклассам переопределять определенные шаги алгоритма без изменения его структуры.

Стоит использовать когда нужно определить инвариативную часть алгоритма, оставив переменные части подклассов, когда несколько классов содержат одинаковые алгоритмы с небольшими отличиями, или для исключения дублирования кода в родственных классах.

`from abc import ABC, abstractmethod

class CarBuilder(ABC):

#Шаблонный метод

def build_car(self): self.add_frame() self.install_engine() self.add_wheels() self.paint() if self.has_sunroof(): # Опциональный шаг self.install_sunroof()

#Обязательные шаги (должны быть реализованы)

@abstractmethod def add_frame(self): pass

@abstractmethod def install_engine(self): pass

@abstractmethod def add_wheels(self): pass

#Шаг с реализацией по умолчанию

def paint(self): print("Покраска в стандартный цвет")

#Опциональный шаг (хук)

def has_sunroof(self): return False

def install_sunroof(self): print("Установка люка")

#Конкретные реализации

class SportsCarBuilder(CarBuilder): def add_frame(self): print("Установка облегченной рамы")

def install_engine(self): print("Установка спортивного двигателя V8")

def add_wheels(self): print("Установка 20-дюймовых колес")

def paint(self): print("Покраска в красный металлик")

def has_sunroof(self): return True

class EconomyCarBuilder(CarBuilder): def add_frame(self): print("Установка стандартной рамы")

def install_engine(self): print("Установка 4-цилиндрового двигателя")

def add_wheels(self): print("Установка 15-дюймовых колес")

#Использование

print("Сборка спортивного автомобиля:") sports_car = SportsCarBuilder() sports_car.build_car()

print("nСборка экономичного автомобиля:") economy_car = EconomyCarBuilder() economy_car.build_car() #weekofpatterns`