Шаблонный метод - определяет скелет алгоритма в базовом классе, позволяя подклассам переопределять определенные шаги алгоритма без изменения его структуры.
Стоит использовать когда нужно определить инвариативную часть алгоритма, оставив переменные части подклассов, когда несколько классов содержат одинаковые алгоритмы с небольшими отличиями, или для исключения дублирования кода в родственных классах.
`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`