Ce este
Șablonul Constructor (Builder) creează un obiect complex pas cu pas. În loc de un singur constructor cu o listă lungă și confuză de argumente, constructorul oferă pași mici, cu nume — și un build() final care returnează obiectul terminat.
Fiecare pas returnează chiar constructorul, așa că apelurile se înlănțuie într-o propoziție ușor de citit.
Exemplu: construirea unei pizze
Comparați PizzaBuilder("large").cheese().topping("mushrooms") cu un apel de constructor precum Pizza("large", True, ["mushrooms"]) — constructorul spune ce înseamnă fiecare valoare, iar părțile opționale sunt pur și simplu omise.
Pași care se înlănțuie
Fiecare pas are un nume și este opțional: pizza mică îi omite pe toți. Fără o grămadă de argumente True, None, False.
Ieșire: program Python complet
from dataclasses import dataclass, field
@dataclass
class Pizza:
size: str
cheese: bool = False
toppings: list[str] = field(default_factory=list)
class PizzaBuilder:
def __init__(self, size: str):
self._pizza = Pizza(size)
def cheese(self) -> "PizzaBuilder":
self._pizza.cheese = True
return self
def topping(self, t: str) -> "PizzaBuilder":
self._pizza.toppings.append(t)
return self
def build(self) -> Pizza:
return self._pizza
big = (
PizzaBuilder("large")
.cheese()
.topping("mushrooms")
.topping("olives")
.build()
)
small = PizzaBuilder("small").build()
print(f"Pizza (mărime: {big.size}), brânză: {big.cheese}, ingrediente: {big.toppings}")
print(f"Pizza (mărime: {small.size}), brânză: {small.cheese}, ingrediente: {small.toppings}")
Când să îl folosiți
Folosiți-l când un obiect are multe părți opționale sau când construirea are pași reali care merită un nume. Cererile, interogările și configurațiile sunt teritoriul clasic al constructorului.
Renunțați la el pentru obiecte simple — un apel cu argumente cu nume, Pizza(size="large"), este deja un mic constructor bun pentru cazurile ușoare.
Avantaje și dezavantaje
Avantaje: construire ușor de citit; părți opționale fără liste uriașe de argumente; obiectul poate fi validat o singură dată, în build().
Dezavantaje: încă o clasă de scris și de întreținut; exagerat acolo unde argumentele cu nume se citesc deja bine.